const和一二级指针的结合

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和一级指针的结合有两种情况:

1const int *p //const修饰指针指向
2int *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 ** 正确

猜你喜欢

转载自blog.csdn.net/Gunanhuai/article/details/108686585