const修饰的变量不能再作为左值,初始化以后不能被修改。
const右边没有*时,如int *const p,这种时候const不参与类型,它就是int *,代表p是个int *的常量。
const修饰的是离它最近的类型
const与一级指针结合
const int *p : 离const最近的是int,去掉int后,const修饰的就是*p,代表*p不能被改变,即p指向的数据不能被改变,p可以被改变重新指向别的内存。 (常量指针)
int const* p : 离const最近的是*,但*不是类型,所以离const最近的还是int,去掉int,修饰的就是*p,也是代表*p不能被改变。(常量指针)
int *const p : 离const最近的是int*,去掉int*后,const修饰的是p,就是指针本身,代表p只能指向那一块内存不能被改变,但是内存的内容即*p(指针解引用)可以改变。(指针常量)
const int *const p : 上面两种类型的结合,第一个const修饰int,代表着指针指向的内容不能被改变,第二个const修饰int *,代表着指针指向的内容不能被改变。
const int* <= int* // 正确 int* <= const int* // 错误
const与二级指针结合
const int **q : 离const最近的是int,去掉int后,const修饰的就是**q,代表**q不能被改变,即最终指向的数据不能被改变,*q和q可以被改变重新指向别的内存。
int *const* q : 离const最近的是*,但*不是类型,所以离const最近的还是int*,去掉int*,修饰的是*q,代表*q不能被改变,**q和q可以被赋值。
int **const q : 离const最近的是int**,去掉int**后,const修饰的是q,就是指针本身,代表q只能指向那一块内存不能被改变,但是内存的内容即*q以及**q可以改变。
const int** <= int** // 错误 int** <= const int** // 错误 int ** const <= int** // 正确 const右边没有*, 不参与类型,就是int** <= int** int** <= int *const* // 错误 int* const * <= int** // 正确 可以映射成 const int* <= int* 是正确的 int* const * <= const int** // 错误
const int** <= int**错误原因:
int a = 10; int *p = &a; const int **q = &p; // 编译出错
对const int **q而言,**q的指不能改变,但是*q可以改变。const int **q = &p相当于 *q = p, **q里面存的是const int 即整型常量,即*q里存的是常量指针。可以做如下操作:
const int b = 20; *q = &b;
如果这么做,相当于
p = &b;
而p是int*型,&b是const int *,在一级指针转换中,int* <= const int* 是错误的。
所以const int** <= int** 也是错误的。改成如下就可以了。
int a = 10; const int *p = &a; // 将*q所指的p改成常量指针 const int **q = &p; // 或者: int a = 10; int *p = &a; const int * const *q = &p; // 不允许*q被改变
int** <= int *const* 错误原因:
int a = 10; int *const p = &a; int **q = &p; // 编译出错
int **q,认为*q是可以修改的,而int *const p认为p是不能修改的,所以矛盾了。
修改:
int a = 10; int *const p = &a; int *const *q = &p;
int* const * <= const int**错误原因:
int a = 10; const int *p = &a; int *const *q = &p; // 编译出错
int *const *q,认为**q是可以修改的,而const int *p 认为*p是不可以修改的,矛盾了。
修改:
int a = 10; const int *p = &a; int const **q = &p; // const int *p没有要求p不能修改,所以改成int const **q,此处*可以修改
const与一级指针、引用的结合引用
1、
int a = 10; int *p = &a; int *&q = p; // 正确
2、
int a = 10; int *const p = &a; int *&q = p; // 错误 因为 int *const p要求p不能被修改, q是p的引用, q可以修改, 矛盾
修改:
int a = 10; int *const p = &a; int *const &q = p;
3、
int a = 10; const int *p = &a; int *&q = p; // 错误 因为 const int *p要求*p不能被修改, q是p的引用, *q可以修改, 矛盾
修改:
int a = 10; const int *p = &a; const int *&q = p;
4、
int a = 10; int *p = &a; const int *&q = p; // 错误
把const int *&q = p 转换成 const int **q = &p,上面已经分析过,const int** <= int**这样转换是错误的。
具体分析:const int *&q 意味 *q的值不能变,而即*q放的是整型常量,即q里存的是常量指针, 但是q本身可以改变,可以做如下操作:
const int b = 20; q = &b;
而q是p的引用,如果这么做,相当于
p = &b;
而p是int*型,&b是const int *,在一级指针转换中,int* <= const int* 是错误的。
所以这里也是错误的。



