初学c/c++时可能会对const和const的含义产生很多疑惑
int a = 1, b = 2;
const c = 3;
const int *p1 = &a;
int const *p2 = &a;
int *const p3 = &a;
const int *const p4 = &a;
我们知道指针本身是一个对象,它又可以指向其他对象。因此指针本身是不是一个常量和指针指向的对象是不是一个常量是两个相互独立的问题。所以为了将这两个问题区分开来,我们将指针
本身
\color{red}{本身}
本身是一个常量定义为
顶层
c
o
n
s
t
\color{red}{顶层const}
顶层const,而将指针
指向的对象
\color{red}{指向的对象}
指向的对象是一个常量定义为
底层
c
o
n
s
t
\color{red}{底层const}
底层const。
如何分辨底层const和顶层const,只需要记住在*右边的属于顶层const,左边的属于底层const。所有常量const都是顶层const。
明白这个概念以后我们将指针* p1看作一个对象,就会发现实际上const int* 和int const*都属于“底层const”,只是const int(*p1)和int const(*p1)在写法上的区别,表示指针所指的对象是一个常量。
当我们要执行对象的拷贝时,拷入和拷出都需要具有相同的“底层const”,或者两个对象的数据类型必须要能相互转换。
例如上面的代码中,
int a = 1, b = 2;
const int c = 10; //c的值不能改变,是一个顶层const
a = c; //顶层const不影响拷贝
c = a; //常量的值不能被改变
const int *p1 = &a; //int *和const int *虽然不具有相同的底层const,但是int *可以转换成const int *
int const *p2 = &a; //同上,int const*和const int*是相同的
int *const p3 = &a; //int *const和int具有相同的底层const,&a和*p3都是非常量对象
const int *const p4 = &a; //靠右的是顶层const,靠左的是底层const
当指针为底层const时,我们可以修改指针的值,让它指向另一个对象,而不能通过指针修改所指向的对象的值。
p1 = &b;
p2 = &b;
而int *const p3则属于“顶层const”,可以看成是int *(const p3),表示指针本身是一个常量。这时我们可以通过指针修改所指向的对象的值,而不能修改指针本身的值。
*p3 = 3;
因为这个markdown语法格式的问题,有些指针*和名字在一起,有些中间有空格,凑活看吧(
如果有什么错误或者遗漏,请在评论区或者站内私信联系我,一起交流学习。