常量指针,表述为“是常量的指针”,就是指向常量的指针,关键字 const 出如今 * 左边,表示指针所指向的地址的内容是不可修改的,但指针自身可变。ios
指针常量,表述为 "是指针的常量", 指针吱声是一个常量,关键字 const 出如今 * 右边,表示指针自身不可变,但其所指向的地址的内容是能够被修改的。函数
例:spa
常量指针:const char* ptr = "hello"指针
指针常量:char* const ptr = "hello"code
这里看关键字靠着谁近,const靠着ptr近说明就是指针常量,就是指针自身不能改变,但所指向的数据能够变;const靠着类型近,说明指针所指向的内容不可变,但指针能够变。内存
常量指针有两种写法:const既能够写在类型前,又能够写在类型后。如上面的例子,常量指针: char const* ptr = "hello" 也是正确的。字符串
最后在举个例子,与迭代器常常在一块儿用。若但愿迭代器所指向的东西不可变,则须要的是 const_iterator。例:it
std::vector<int>::const_iterator iter = vec.begin(); *iter = 10; //错误,iter是常量指针 iter++;//正确,iter自己可变
若但愿迭代器自己不可变,指向的内容可变,则能够这样写:io
const std::vector<int>::iterator iter = vec.beign(); *iter = 10;//正确,指针常量 iter++; //错误,指针自己不可变
指针常量定义时必须初始化,不然报编译错误,由于此时不赋值便没有机会赋值了。编译
下面看几个简单的例子,能够说明他们的区别:
第一个
#include <iostream> using namespace std; int main() { char *str1 = {"hello"}; char *str2 = {"hello world"}; char * const ptr1 = str1; //指针常量--指针自己是常量,指向的地址 //不能够变化,可是指向的地址所对应的内容 //能够变化 ptr1 = str2; //错误,由于这是一个指针常量 //改变指向的地址了 cout << *ptr1 << endl; return 0; } //编译错误 error: assignment of read-only variable 'ptr1'
第二个
#include <iostream> using namespace std; int main() { char *str1 = {"hello"}; char *str2 = {"hello world"}; char * const ptr1 = str1; //指针常量--指针自己是常量,指向的地址 //不能够变化,可是指向的地址所对应的内容 //能够变化 ptr1 = "A"; //错误,显示内存错误,由于"hello"为常量 //不得修改,意指指针常量中,指针不得改 //常量也不得改 cout << *ptr1 << endl; return 0; }
第三个
#include <iostream> using namespace std; int main() { char *str1 = {"hello"}; char *str2 = {"hello world"}; const char *ptr1 = str1; //常量指针--指向字符串常量,所指向的字符串 //内容不能变,可是指向的地址能够变化 //至关于在此处将前边的str1追加定义为常量 ptr1 = str2;//正确 由于指向的地址是能够变化的 cout << ptr1; return 0; } //输出 hello world
#include <iostream> using namespace std; int main() { char *str1 = {"hello"}; char *str2 = {"hello world"}; const char *ptr1 = str2; //常量指针--指向字符串常量,所指向的字符串 //内容不能变,可是指向的地址能够变化 //至关于在此处将前边的str1追加定义为常量 ptr1 = 'A';//错误,由于指向的地址的内容是不能够变化的 cout << ptr1; return 0; }
相信从上面四个简单的例子能够看出他们不同的地方吧,在这里要请你们注意一下的地方是:
指针常量的申明:const 放在*和指针名之间 Type* const pointer;
常量指针的申明:const放在类型说明符以前 const Type* pointer;
实际分两部分: type* 为指针 const 为常量 自由组合便成为指针常量,常量指针
常量指针、指针常量,个人判断原则是 const 和 * 的前后顺序。const在前常量指针,常量内容不可变,指针可变
*号在前,指针常量,指针不可变,内容可变
const 还能够修饰函数:
若是给以“指针传递”方式的函数返回值加 const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数
const char * GetString(void);
以下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();
若是函数返回值采用 “值传递方式”,因为函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。