int const *p
const修饰的是 *p
表示*p不能被更改
即地址里面的内容不能更改
但p本身并不是常量,可以更改
也就是一个指向常量的指针
在你的例子中p值发生了改变,前后p所的地址里面的内容没有更改,如果你*p=3 肯定就会运行时错误
p的值可以改变,但p指向地址的内容不能改变,之所以*p的值变了,只是因为p指向另外一个地址了,而不是原来的地址的内容改变了
如果要达到指针的值不能更改并且指针所指内容也不能更改的效果,则要定以为const int * const p
你前面的理解很正确。关键就在p当前到底指向哪个地址,p指向某个地址,这个地址空间的内容就不能改变,p指向另一个地址,则原来的地址空间就不再受约束,新的地址空间开始受约束。
你没搞懂这个int const *p为一个常量指针的真实含义
这个意思是p指向的值是常量
即*p是常量
其地址p是可以改变的
不然你可以试着*p=b
就会报错
你要让p的地址是常数的话,该用的命令式
int * const p
表示地址p是常量
可以参考下 http://blog.csdn.net/gaoxiaowei/article/details/2814295
可以参考下 http://www.bccn.net/Article/kfyy/cyy/jszl/200711/6647.html