C/C++杂谈
指针常量、常量指针
有的时候稍不注意就会将两者混淆,即便再去看一下资料,过一段时间又会忘掉,于是今天就用实际代码来看看两者到底有什么区别。
首先,在C/C++中,常量是什么意思?
常量的关键词是const,即,无法被改变。在编译阶段,编译器若发现对常量进行了修改,就会出现提示。基于此,常量在声明时就必须初始化,而且之后都不能改变,见下:
若不初始化:
若尝试改变:
ok,现在我们明白了常量是什么意思:初始化之后无法被改变的值。再解决一个小问题:指针是什么?
简单来说,指针就是一个盒子,里边放着一把钥匙,我们可以通过这把钥匙去打开一个对应的保险箱取出东西。
盒子=指针,根据系统位数32/64位数不同,这个盒子的大小可能为4/8字节大小;
钥匙=内存地址,根据系统位数32/64不同,这个钥匙大小也是4/8字节;
那,房间是什么?
保险箱=内存片段,利用钥匙中隐藏至高奥秘——内存地址,访问对应内存地址的内存片段(房间),取出其中的宝藏!
盒子、钥匙、保险箱,这三者哪个能变呢?
答曰:钥匙和保险箱可以变,盒子不能。
为什么盒子不能?
——因为盒子即是指针这个对象自身的地址,在声明这个指针的时候它就已经确定下来了(确定将这个指针盒子“放在”哪个内存位置)。就像下图所示,p1这个指针盒子,自出生的时候,它的位置就已经确定了,不存在重排座次的问题:
慢慢捋一捋,我们能改变的只有盒子里的钥匙和钥匙对应的保险箱。
怎么改变钥匙?
——简单,打开盒子,把钥匙换成其他的就行了,比如:
上图p1这个盒子中本来放的打开“1”保险箱的钥匙,被换成打开“2”的了。
PS:new 之后记得delete,例子那么写是会内存溢出的;
怎么改变保险箱?
——在回答之前,我们需要注意,钥匙和保险箱是配套的!如果改变了钥匙,那么打开的保险箱也就不同了,而且保险箱和钥匙本身的对应关系是无法被改变的(一般情况下)。
于是,我们所说的改变“保险箱”,其实说的是改变保险箱里的东西,打开保险箱,把箱子里的东西换一下,见下:
上图,就是打开保险箱,将里边存的“一指禅”换成了“二指禅”!
好了好了,回到正题,什么是指针常量和常量指针?
指针常量是指针本身是常量。
这不废话嘛,刚刚不是才说指针这个盒子是不能变的嘛!?
且慢,这里说的“指针本身是常量”,是说指针内部存的钥匙是无法改变的!你想想,盒子不变+盒子里的钥匙不变,不久等于指针不变么?
常量指针是指针指向的常量。
此话可解?
——(都说了只有钥匙和保险箱可以变,前面已经提到了钥匙不变的情况,所以…)常量指针是说钥匙对应的保险箱,它里面的东西不能变!保险箱一开始存的是“一指禅”,到死也只能是“一指禅”!
来看看下面两个例子,想一想哪一个是指针常量,哪一个是常量指针?
好好结合刚刚那几句话——钥匙、盒子、保险箱,应该就很简单了。
图一是常量指针,不能改变保险箱里的东西,但是——可以改变盒子里的钥匙;
图二是指针常量,不能改变盒子里的钥匙,但是——可以改变保险箱里的东西;
这两个东西语法上怎么定义的?
简单,看看const之后跟的是什么就可以了,跟的*,那就是常量指针,否则是指针常量,如下:
int* const p1=new int(1);
上面是指针常量,下面都是常量指针:
int const *p1=new int(1); const int *p1=new int(1);
上面是指针常量,下面都是常量指针:
int const *p1=new int(1);
const int *p1=new int(1);
完。