1) int * const p; 指针常量:p 是 int*类型,那么const修饰的是p,所以p是常量,表示p指向的地址不可修改, 也就是说,p不能再指向别的地方了,但是可以修改p指向的这个地址里的值。 举例: int a = 10; int b = 20; int * const p = &a; p = &b;// 错误 *p = 100;// 允许
2) const int *p; int const *p; 常量指针:p 是 int*类型,那么const修饰的是*p,所以*p是常量,表示p指向的地址里的值不可修改, 也就是说,p里的值不能再重新赋值了,但是可以修改p指向的地址。 int a = 10; int b = 20; const int *p = &a; p = &b;// 可以 *p = 100;// 错误
3) const int * const p; 常量指针常量:p 是 int*类型,那么const分别修饰了p 和 *p, 所以p和*p都是常量,表示p指向的地址不可修改, 同时p指向的地址里的值也不可修改。 int a = 10; int b = 20; const int *const p = &a; p = &b;// 错误 *p = 100; // 错误
《C Primer Plus》 : "自由的代价,是永远的警惕。" 你定义了一个指针,那就一定要知道这个指针指向的什么地方,而且你要保证这个指针是真实有效的,否则我就用程序崩溃来惩罚你。
四、多级指针
#include <stdio.h> int main(void) { int a = 10; int *p = &a;// 定义一个一级指针变量,存储了整型变量a的地址 int **pp = &p;// 定义一个二级指针变量,存储了整型一级指针变量p的地址 int ***ppp = &pp;// 定义了一个三级指针变量,存储了整型二级指针变量pp的地址