- 普通非指针变量与const的情况
const int a = 3;
a = 4; // 错误,a初始化后不能再重新赋值
- 指针变量指向的内容不能被修改
这是比较常见的情况,就是在指针类型前或者后面加上const,比如对于int型指针,就在int前面或者后面加上const
const int *p;
// int const *p; // 在int前后紧跟const,这表示p指向的那个int型数据不能改变,但是p本身的指向是可以变的
p = &y; // 正确,改变指针指向没问题
*p = 3; // 错误,改变指针指向的内容不行
- 指针变量不能重新赋值
把const紧放在变量前面,*
后面
int * const p = &x; // 初始化后就不能再重新赋值了
*p = 3; // 正确,还是可以通过p改变其指向的int型变量
p = &y; // 错误,和上面的普通非指针变量a类似
- 指针的指针的指针...
请直接看总结
总结
其实不用整得这么乱七八糟的,就一点,const如果放到最前面,比如const int ***a
,那么表示a[0][0][0]
是const int
类型,不能改变的数据是int类型(可以看成是const和后面的int结合到一起,但不会继续向后面和*
结合),所以如果要表示int*
不可以更改,那么把这个声明该成const放到中间的方式,const左边表示的类型是不能修改的:int * const **a
表示a[0][0]
是int *const
类型,是不能修改的,但是a[0][0][0]
的类型是int
,它是可以修改的
如果进一步要让a[0][0][0]
也不能修改,那把声明改成const int * const **a
或者int const * const **a
(前面说过,const写到最前面就紧和后面的int结合到一起,表示int const
类型,int数据不能被改变)
有的时候把多层指针写成数组的形式,其实都差不多,还是看const左边是啥类型,比如const int a[][][]
或者int const a[][][]
表示a[0][0][0]
是const int
类型,不能改变int型数据,int *const a[][]
表示a[0][0]
是int *const
类型,指向的int*
不能修改,但是a[0][0][0]
这个int型数据是可以修改的。
最后,对于指针变量是const的情况,定义时需要给这个指针初始化,因为后面不能再修改指向了,比如int *const p = &x;
这里定义时初始化是必须的不能写成int *const p; p = &x;
这样两句。