int main() { int apple = 3; const int *p1=&apple;/*p1是一个指向int型常量的指针,虽然apple不是常量,但傻乎乎的p1以为它是个常量,因此不能通过p1修改apple的值*/ int const *p2=&apple;/*和上面的没有区别,const在int的左右都一样*/ int * const p3 = &apple;/*这里的p3是一个常量指针,也就是说不能修改p3的值,但我们可以通过p3修改apple的值*/ }
然而,当const碰到多重指针的时候,情况就会变得复杂起来,我们可能会有
1 2 3 4
const int ** p1 = &p; int const ** pp2 = &p; int *const* pp3 = &p; int **const pp4 = &p;
int main(void) { int apple=3; const int * p = &apple; /*如果p的定义为 int * p = &apple,则下面两句就会报错 */ const int ** pp1 = &p; int const ** pp2 = &p; //*(*pp1) = 5;这句会报错 return 0; }
1
int *const* pp3 = &p;
表示pp3指向一个常量指针(即c++ primer 中说的顶层指针),比如
1 2 3 4 5 6 7 8 9 10
#include<stdio.h> int main(void) { int apple=3; int banana = 2; int * const p = &apple; int *const* pp3 = &p; //*(*pp3) = &banana;这句会报错 return 0; }
1
int **const pp4 = &p;
则表示pp4本身是一个常量,比如
1 2 3 4 5 6 7 8 9
int main(void) { int apple=3; int * p1 = &apple; int * p2 = &apple; int ** const pp4 = &p1; //pp4 = &p2;这句会报错 return 0; }