对于const int* p 和 int *const p的区别往往让人感到傻傻分不清楚。
我分别这两者主要看*和const的位置,const在*左边即修饰指针指向的值不可改变,在*右边即修饰指针p,代表p不能修改。
这里有个有意思的情况,当cosnt int * p = &b时。
1. 对于指针p如果进行操作*p = 5;进行赋值,编译器会报错,表示不能进行修改。那么是不是意味着b的值就不能修改了呢?
对于这个问题进行下面操作:
int b = 9;
const int* p = &b;
cout << "p地址 :" << p << " *p: " << *p << endl;
int *pp = &b;
*pp = 10;
cout << "pp地址:" << pp << " *pp: " << *pp << endl;
cout << "p地址 :" << p << " *p " << *p << endl;
vs2013输出信息:
p地址 :0019F95C *p: 9
pp地址:0019F95C *pp: 10
p地址 :0019F95C *p 10
请按任意键继续. . .
从这个结果来看,b的值实际是被修改了,因为最后*p的值也变为了10。这是什么原因造成的呢?
在我看来,因为b实际是保存在一块内存0019F95C中,而指针p,pp只是指向了这块内存,const的作用域其实也仅仅是限制p指针不能修改,而对于其他指向b的指针const并不能进行限制,也就是说p不能修改b的值,但不影响其他指向b的指针例如pp去修改b,而当pp修改了b的值以后,由于内存0019F95C中的值编程了10,所以*p的值也就变为了10。
常量指针是指向常量的指针,指针指向的内存地址的内容是不可修改的(这句话是引用其他博客的定义)。
这个定义是比较常用的定义,但是会出现歧义,“内容是不可修改的”到底是都不可修改,还是只是当前指针不能修改表述的不是很明确,因此才会出现文章开头的疑问。
常量指针是指向常量的指针,指针指向的内存地址的内容(对于当前指针来说)是不可修改的。
我在原定义的基础上加限定词,这样可以最大限度的消除歧义,也能更好的理解。
2. 对于int* cosnt p,这个表述是在限定p所在的内存的内容,程序可以看出,p和pp所在的内存的值都是0019F95C,这个值是b的内存地址。指针指向对象的改变其实质就是对指针所在内存的值得改变(指针内存中保存的值即指向对象的地址)。
int * const p = &b其实就是限定p所在内存保存的值只能是b的地址(0019F95C),通过这种方式确保p不会再指向其他的对象。
以上阐述都是基于自己的理解,如有错误的地方请各位留言告知,以便及时修改。谢谢。