const修饰的量常出现的错误:
1,常量不可以在作为左值。(直接修改常量的值)
2,不能把常量的地址泄露给一个普通的指针或者普通的引用变量。(间接改变常量的值)
const和一级指针的结合
C++语言规范:const修饰的是离它最近的类型
const int *p //*p不可以在被赋值,但是p可以被赋值,p没有被任何修饰,可以任一指向不同的int型内存,但是不能通过指针间接修改指向的内存的值。
int const *p//和const int *p完全一样
int *const p//const修饰int *,直接修饰指针p,指针p是常量,不能再指向其他内存,但是可以通过指针的解引用修改指向的内存的值。
const int *const p//*p不能被赋值,p也不能被赋值
综上,const和一级指针的结合有两种情况:
1,const int *p //const修饰指针指向
2,int *const p//const修饰指针本身
总结const和指针的类型转换的公式:
int * <= const int * 错误
const int * <= int * 正确
由图可以看出,在编译器看来int* p和int *const p本质上是没有区别的,都是int *型。所以有下边结论:
const如果右边没有指针(也就是没有*),const是不参与类型的。
const和二级指针的结合:
int a = 10;//经典的一级指针指向变量,二级指针指向一级指针;
int* p = &a;
int** q = &p;
将 int** q = &p; 变成const int** q = &p;这个类型转换到底正确与否?也就是const int ** <=int **是否能正确转换?
由图可以知道const与二级指针结合有三种情况:
1.const int **q;
2.int *const *q;
3.int **const q;
int ** <= const int ** 错误
const int ** <= int ** 错误
int ** <= int* const * 错误
int* const * <= int ** 正确