C++中经常提到顶层const和底层const,实际上就是在声明的时候,const int* 和int* const的区别,那这两者到底有什么区别呢?
const int*
分为两种情况:
第一种
指针指向一个const int类型。所以指向的内容,变量本身是不可变的,因为是const。所以我们把他叫做底层const,顾名思义,我们可以把指针视为“顶”,变量本身是“底”,因为指针就是加多了一个外壳,存放了变量的地址,如下图,黑色、红色箭头分别代表访问变量的两种途经。

第二种
指针指向一个int类型,此时就会发生隐式类型转换,指针使用变量时给变量加上了const,指针认为变量是const的,但实际上变量并不是const。所以指向的内容,通过这个指针是不能变的。但是,可以通过变量本身去改变。
//第一种情况
const int i=3;
const int* p = &i; //指向一个const的类型
i=4; //写入失败,因为i是const类型,不能改变其值
*p=4 //写入失败,因为指针也认为i是const类型
cout<<*p; //结果是3
--------------------------
//第二种情况
int a=3;
const int* p=&a; //指向一个非const的类型
a=4; //这里成功修改了a的值
*p=4 //写入失败,因为指针认为i是const类型
cout<<*p; //输出4
另外: int const * 与const int *没有区别
int* const
指针是个常数,意味着指针的指向不能变,但是指针指向的变量本身是可变的,所以我们又把他叫做顶层const。
int j=1;
int i=2;
int* const b = &j; //指针本身是不可修改的,即不能改变它的指向
b=&i; //试图改变指针的指向,error
*b=2; //指针不能改变但是内容是可以该改变的
cout<<*b;//输出2