1.const 和一级指针的使用
int a = 0, b = 0;
const int *p = &a;
*p = 10; // error
p = &b; // right
const放在指针的前面,修饰p的指向内容不能做修改。
const修饰的就是*p,实际上就是对p进行解引用,也就是a,那么在这里a是一个常量,也就是说,限定p指向的内容不允许被修改,但不限定p的指向,p可以指向a,也可以指向b。
int* const p = &a;
*p = 10; //right
p = &b; //error
const放在指针的后面,修饰p变量本身,p的值不能做修改。
const修饰的是p,p为常量,p指向的是a,此时p就不能指向b。但是通过对p解引用,也就是a是一个变量,p的指向内容可以被修改,p本身不能修改。
const int* const p = &a;
*p = 10; //error
p = &b;//error
这种情况就是const既限定了p本身,又限定了p的指向内容,所以通过*p(指向内容),p(本身)都不能进行修改。
const int a = 0; const int b = 0; int *p = &a; //error
假设int *p = &a正确,那么就可以通过*p去改变a的值,但在这里,a明显是一个常量,因此这样的写法是错误的。如果需要将其改正确,对*p进行限定就可以了。
const int a = 0;
const int b = 0;
const int *p = &a; //error
2.const和二级指针的使用
int a = 0; int b = 0; const int *p = &a; // 不能通过*p来修改值 int *const q = &a; // q本身被限定,不能被修改 int **s1 = &p; s1 = &q; //s1关联q **s1 = 20; // s1解两次引用,也就是间接修改a的值,a的值没有被限定 const int **t1 = &p; //const修饰**t1,不能通过**t1来修改a的值 *t1 = &b;//right 通过*t1修改p的指向 **t1 = 10;//error const修饰**t1,不能通过**t1来修改a的值 int *const * s2 = &p; //const限定*s2,不能通过*s2改变p的指向 *s2 = &a; //error 不能通过*s2改变p的指向,这里偏要改,这显然是错的 **s2 = 100; // **s2不被限定,所以可以修改
const int a = 0; //const修饰a,a的值不能修改 int b = 0; const int *p = &a; //const修饰*p,不能通过*p来修改a的值 p = &b;// right p的指向不被限定,可以修改 *p = 10;//error const int *const *s = &p; // **s和*s都被限定,不能通过**s,*s进行修改 *s = &a;//error **s = 10;//error int **const t = &p;//error p本身是一个const int* 类型,定义p的二级指针,首先类型得相同 const int* *t = &p; const int* *t = &p; **t = 10;//error **t被限定 *t = &a;//right 修改p的指向



