C/C++杂谈(1)指针常量、常量指针

·  阅读 607

指针常量、常量指针

有的时候稍不注意就会将两者混淆,即便再去看一下资料,过一段时间又会忘掉,于是今天就用实际代码来看看两者到底有什么区别。

首先,在C/C++中,常量是什么意思?

**常量的关键词是const,即,无法被改变。**在编译阶段,编译器若发现对常量进行了修改,就会出现提示。基于此,常量在声明时就必须初始化,而且之后都不能改变,见下:

若不初始化:

img

若尝试改变:

img

ok,现在我们明白了常量是什么意思:初始化之后无法被改变的值。再解决一个小问题:指针是什么?

简单来说,指针就是一个盒子,里边放着一把钥匙,我们可以通过这把钥匙去打开一个对应的保险箱取出东西。

盒子=指针,根据系统位数32/64位数不同,这个盒子的大小可能为4/8字节大小;

钥匙=内存地址,根据系统位数32/64不同,这个钥匙大小也是4/8字节;

那,房间是什么?

保险箱=内存片段,利用钥匙中隐藏至高奥秘——内存地址,访问对应内存地址的内存片段(房间),取出其中的宝藏!

盒子、钥匙、保险箱,这三者哪个能变呢?

答曰:钥匙和保险箱可以变,盒子不能。

为什么盒子不能?

——因为盒子即是指针这个对象自身的地址,在声明这个指针的时候它就已经确定下来了(确定将这个指针盒子“放在”哪个内存位置)。就像下图所示,p1这个指针盒子,自出生的时候,它的位置就已经确定了,不存在重排座次的问题:

img

慢慢捋一捋,我们能改变的只有盒子里的钥匙和钥匙对应的保险箱。

怎么改变钥匙?

——简单,打开盒子,把钥匙换成其他的就行了,比如:

img

上图p1这个盒子中本来放的打开“1”保险箱的钥匙,被换成打开“2”的了。

PS:new 之后记得delete,例子那么写是会内存溢出的;

怎么改变保险箱?

——在回答之前,我们需要注意,钥匙和保险箱是配套的!如果改变了钥匙,那么打开的保险箱也就不同了,而且保险箱和钥匙本身的对应关系是无法被改变的(一般情况下)。

于是,我们所说的改变“保险箱”,其实说的是改变保险箱里的东西,打开保险箱,把箱子里的东西换一下,见下:

img

上图,就是打开保险箱,将里边存的“一指禅”换成了“二指禅”!

好了好了,回到正题,什么是指针常量和常量指针?

指针常量是指针本身是常量

这不废话嘛,刚刚不是才说指针这个盒子是不能变的嘛!?

且慢,这里说的“指针本身是常量”,是说指针内部存的钥匙是无法改变的!你想想,盒子不变+盒子里的钥匙不变,不久等于指针不变么?

常量指针是指针指向的常量

此话可解?

——(都说了只有钥匙和保险箱可以变,前面已经提到了钥匙不变的情况,所以...)常量指针是说钥匙对应的保险箱,它里面的东西不能变!保险箱一开始存的是“一指禅”,到死也只能是“一指禅”!

来看看下面两个例子,想一想哪一个是指针常量,哪一个是常量指针?

img

img

好好结合刚刚那几句话——钥匙、盒子、保险箱,应该就很简单了。

图一是常量指针,不能改变保险箱里的东西,但是——可以改变盒子里的钥匙;

图二是指针常量,不能改变盒子里的钥匙,但是——可以改变保险箱里的东西;

这两个东西语法上怎么定义的?

简单,看看const之后跟的是什么就可以了,跟的*,那就是常量指针,否则是指针常量,如下:

int* const p1=new int(1);
复制代码

上面是指针常量,下面都是常量指针:

int const *p1=new int(1);
const int *p1=new int(1);
复制代码

完。

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改