int *const p:常量指针,其本质是一个常量(用指针修饰),这个常量的内容是一个指针,不可以修改p指向的地址,但是可以修改*p的值。定义的时候要赋初值。(数组名也是一个指针常量)
int const *p(const int *p):指针常量,其本质是一个指针(用const修饰)。说明它指向的对象是一个常量,这个对象不能被更改,可以修改p指向的地址,但是不可以修改*p的值。
const int *const p:指向常量的常量指针,既不可以修改p指向的地址,也不可以修改*p的值。
分辨指针常量和常量指针
在int const *p和int *const p中从右向左读遇到p以后替换为"p is a",遇到"*"以后将其替换为"point to"。所以int const *p是p is a point to const int(p是指向常量int的指针(指针常量)),int * const p 中p is a const point to int (p是一个指向int的常量指针) 。
const后面的内容为常量
const int p; // p 为常量,初始化后不可更改
const int* p; // *p 为常量,不能通过*p改变它指向的内容
int const* p; // *p 为常量,同上
int* const p; // p 为常量,初始化后不能再指向其它内容
、
总结:指针常量地址只读,说明指针常量能读取不同的地址,但是不能修改其指向地址的值。
常量指针变量只读,也就是说指针变量只能读取一个地址,但是可以改变该地址的值。