const不但可以设基本数据类型为常量,也可以跟指针产生一点关系。其中const与指针的位置排布不同会产生不同的区别,比如下面的3句你能说出有什么区别吗?
const int * p;//形式1
int const * p;//形式2
int * const p;//形式3
下面让我来一一道来它们的来龙去脉。
一、形式1
我们先来看去掉const的形式代表什么意思,很明显,表示p是一个指向int型变量的指针。
int * p;//p里面保存的是指向int变量的指针
而加上const什么意思呢,到底什么是常量,我们进行如下代码的实验。
int main()
{
int a=10;
int b=20;
const int * p=&a;
*p=b;//测试1
p=&b;//测试2
a=b;//测试3
cout<<*p<<" "<<a<<endl;
return 0;
}
编译提示如下的问题:
测试1编译不过,说明*p是read-only,*p被常量化,不能更改;测试2和测试3没问题,说明此时指针p可以指向其他任意int变量,a也可以重新赋予其他Int值。
二、形式2
我们也来看看去掉const的形式,很明显,p还是一个指向int型变量的指针。
int * p;//p里面保存的是指向int变量的指针
而加上const什么意思呢,到底什么是常量,我们进行如下代码的实验。
int main()
{
int a=10;
int b=20;
int const * p=&a;
*p=b;//测试1
p=&b;//测试2
a=b;//测试3
cout<<*p<<" "<<a<<endl;
return 0;
}
编译出现同样的问题
说明形式2和形式1表示同样的意思,*p被常量化,但p可以指向其余int变量。
三、形式3
去掉const,表示的意思和形式1和形式2相同。我们将代码中的定义更改一下。
int main()
{
int a=10;
int b=20;
int * const p=&a;
*p=b;//测试1
p=&b;//测试2
a=b;//测试3
cout<<*p<<" "<<a<<endl;
return 0;
}
此时编译提示如下
现在的问题和形式1、2的不一样了,测试2没有通过,说明p是一个常指针,不能指向其他int变量,只能指向a。
现在三种形式已经讲解完毕,你是不是可能脑洞大开,会不会下面有这种形式存在
const int * const p;
答案是存在的,表示*p和p都被常量化。