1)const int *p
2)int const *p
3)int * const p
4)const int * const p
(1)
当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。
(2)
const只修饰其后的变量,int const *p 和 const int *p等价
(3)
int * const p
此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。
(4)
*p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。
int a,b;
int *const p=&a;//指针常量
*p=9;
p=&b;//错误
因为声明了指针常量,说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是该地址里的内容可以被修改
int a,b;
const int *p=&a;
*p=9;//错误
p=&b;
因为常量指针本质是指针,并且这个指针是一个指向常量的指针,指针指向的变量的值不可通过该指针修改,但是指针指向的地址可以改变。