理解一:
1、const在*前,内容不能变;
const int * p1; //const修饰的是int * p1,说明这个变量是不能变的,就是p1所指向的变量是常量变量
表示不能通过指针p1修改它指向的内存单元的值,但是p1本身可以修改。
int const *p2=&i; //与p1相同,const修饰的是*p2(表示所指向的变量)说明p2所指的变量不能改变,也就是 指向常量变量;
不能修改p2指向的内存单元的值,但是可以修改p2使其指向其他的内存单元,这里p2指向了整形变量i。
所以p2=&j;修改p2,使其指向整形变量j,正确。
*p2=30;通过p2修改它所指向的内存单元的值,错误。
2、const在*后,指针不能变;
int *const p3=&i;//const修饰的是p3,说明指针变量的值不能改变,也就是不能让p3指针再指向其他值
p3本身指向整型变量的常指针,即p3初始化后不能再指向其他的内存单元,但是可以修改p3指向的内存单元的值。这里p3指向了整形变量i。
所以*p3=30;通过p3将变量i的值修改为2,正确。
p3=&j;修改p3,使其指向j,错误。
理解二:
const*,指针指向常量;const int * p1;//所指物是常量,而指针不是常量,可以不必须初始化。
int const *p2=&i;//p2取i的地址
*p2=30;//所指物是常量,所以错误
*const,指针本身为常量;int *const p3=&i;//指针本身为常量,必须初始化,且初始化为i的地址,不可修改
*p3=20;//修改p3所指向的内容
p3=&j;//指针自身是常量,所以错误
*const*,指针和所指物都是常量;
const int p1必须初始化,const int &p1必须初始化。