c++ 指针与cosnt指针
1.指针
创建一个指针变量:
int * p;

不难理解,指针变量是一个保存地址的变量,地址指向另一块内存,可以通过指针变量中保存的地址,对该地址的内存进行操作
2.const 修饰的指针
const修饰的指针可以分为三种
1.常量指针
2.指针常量
3.const同时修饰指针和常量
理解指针
我觉得背起来很麻烦,为了更好的理解,不妨换一个思路,回到指针pointer的基本定义
我们将int * p分为的* p分成两个部分:*和p,那么上图就可以分为两部分,左边的方框(变量p)和一个箭头(指针*)
方框(变量p)是什么?
是一块内存
用来干什么?
用来保存数据;
用来保存类型的数据?
地址
*箭头又是什么?箭头更像是一个动作,对指向的那块内存进行操作
那么 int * p就可拆分了,可以理解为我们其实创建了两个变量,其中一个叫指针,另一个叫变量:
1.我们创建了一个int型的指针*,(注意不是指针变量),即为上图中的箭头
2.我们同时创建了一个常量p
当然我们也可以用float、char等别的类型,但是这里的类型决定了我们的箭头(指针)所指向的那块地址是什么类型的变量,我们要对什么类型的变量进行操作

现在我们不妨认为,p是一个大脑,*是一个手爪,大脑告诉手爪它的目标(一个地址),也就是要对什么东西进行操作,手爪就会瞄准那个目标,
而手爪对物体进行操作,则就和大脑无关了,我想抓就抓,想放开就放开,同时,而对不同种类的目标操作我们则需要不同的工具
-
有一块木头的话,我们要给手爪一把斧子(
int); -
一个乒乓球的话,我们需要给手爪一个球拍(
float); -
有一只猹,我们就需要给手爪一支叉(
char) -
注意先后顺序,是先给手爪一个工具,手爪才能对对应的东西进行操作
notice:
-
1.而此处我们只用了一个
int来定义,因为我们只需定义指针*,也就是箭头所指向的变量是什么类型,变量p所保存数据的类型是固定的,是一个地址(e.g 0x61fe) -
2.现在有一个好消息,除了对常见的物体进行操作,由于医疗技术的提高,我们可以直接对另一个大脑进行操作了,这就是二重指针
现在,让我们回过头来
我们现在再来看const修饰的指针变量,对于const修饰的一重指针来说,我们先记住两件事:
-
一个const只能修饰一个东西,不论是
*还是p; -
const会修饰它后面离他最近的那个可修饰元素;
1.const int * p,
这里const修饰的就是*,这意味着,你的手爪的手指被锁死了,你的五个手指都没有办法动,但是大脑p则不受影响,依旧可以随意摆放手爪,这时候大脑给手爪
*一支叉(char),手爪就知道了,爷是要去叉猹的,好,p再给手爪*一个目标,手抓说:好,爷要去叉猹了。但是手爪一看,爷被锁死了啊,没办法扔叉,手爪
只能瞄准那只猹,而且能告诉大脑那只猹的大小,因为我有目标,我就能看的见嘛(具体的变量值,也就是解引用)

2.int * const p
这时候,大脑就被锁死了,这意味着,不论我面前有多少多少猹,我就盯死那一只不变了,那么这时手爪就自由了啊,我想叉就叉,想几次就叉几次
那么这时候目标不变,所以大脑p的值是不变的,手爪*就可以随便动,对猹操作,秀它,叉一下,那目标的猹就变成了死掉的猹,两下,就变成了有两个洞的死掉
的猹。。。

2.const int * const p
自己想吧,都这样了还能干点啥,等着被猹叉吧
int a, b = 10, 20;
int * const p = &a;
*p = 20; //可以
p = &b; //8行

浙公网安备 33010602011771号