指针第五部分(const修饰的指针、多级指针)---- 2021.2.22

上一讲指针链接:

指针第四部分(野指针、空指针、万能指针)---- 2021.2.5

const修饰的指针

我们先讲使用const关键字修饰的变量。

举个例子:

const int a = 10;

const关键字作用:修饰变量a,不能通过变量a来修改变量a内存里面的内容,从而只能通过指针来修改其中的内容。

那我们看看我们正常想将a的内容修改为100,会不会成功运行呢?结果编译器提示有错误信息。如下图所示。

在这里插入图片描述
前面我们也提过可以通过指针来修改其中的内容,我们试试。结果如下所示。

在这里插入图片描述如上图所示,最终我们可以通过指针变量p来成功修改其变量a的内容。

那我们再想一个问题,我们如果用const关键字来修饰指针会如何?举个例子

const int *p = &a;

同理,我们想要修改其变量a的内容就不能通过指针变量p来修改了。因为const修饰的整体为 *p,众所周知,*p代表指针变量p指向的那块空间的内容,前面也提到了const关键字的作用,所以就不能通过*p来修改其对应的内容。

再举个例子

int *const p = &a;

如上所示,我们分析下,首先我们定义了一个指针变量p,其数据类型是int * 类型的。可是我们都看到const关键字修饰的是指针变量p。众所周知,指针变量p存放的是其变量a的地址,所以结合上述const关键字的作用,我们就不能修改变量p保存的地址,但是却可以通过*p来修改其变量a的内容。

为了让大家更容易理解,再举个例子。

const int *const p = &a;

由前面几个例子可知,分析如下:首先这里面有两个const关键字,分别修饰*pp。所以我们不能通过*p修改指针变量p所指向的那块空间的内容还有不能修改指针变量p保存的变量a的地址。

多级指针

首先,我们定义一个变量,其数据类型为int类型,并且将其变量赋值为10。

int a = 10;

那我们先定义一个指针变量,用于存放其a的地址。

还记不记得我们之前在前面一篇文章中讲过定义指针的3个步骤,具体可参考下面这个网址,回顾下。这里再贴一下吧。

指针第二部分(指针变量的定义、初始化、使用)---- 2021.1.29

在这里插入图片描述
那我们可以根据上面图片中所展现的3个步骤所示。
//*p int a int *p

int *p = &a;//等价于int *p; p = &a;

同理,我们定义一个新的指针变量,用于存放其指针变量p的地址。
//*q int *p int *(*q)

int **q = &p;

为了让大家更好的理解上述的定义,特意画了一张图供大家观看。如下所示。

在这里插入图片描述

那问题来了,怎么能让指针变量q直接操纵变量a的内容呢?也就是怎样让指针变量q来直接指向变量a呢?

回答如下
由前面可知,p保存的是a的地址,即&aq保存的是p的地址,即&p。那么*q代表提取其指针变量所指向的那块内存空间的内容,即*q = &a。在刚开始已经说了,另一种保存了a的地址为指针变量p,所以*qp某种意义上是等价的。所以有了如下分析:

**q = *(*q) = *p 

并且*p代表提取其指针变量p所指向的那块内存空间的内容,即*p = a = 10

**q = *(*q) = *p = a = 10

最终也就达到了我们想要通过指针变量q来直接操作变量a的内容了。

我们一般在应用时,一般只会用到二级指针,但是为了更好的让大家理解,我们再想一下,如果想要定义一个指针变量k用来存放我们上述提到的指针变量q的地址,那其实很简单,我们就会用到三级指针。如下所示。

还是同样的操作,参考上述定义指针的三个步骤。
//*k int **q int ***k

int ***k = &q;

所以从中我们其实可以发现一个规律:

定义多级指针保存数据的地址时,定义的指针类型只需要比要保存的数据的类型多一级 ‘ * ’

如我们定义多级指针k用来保存二级指针变量q的地址时,因为指针变量q的数据类型为int ** 类型,那么我们在定义指针变量k时,只需要多加一个 ‘ * ’即可。最终指针变量k的数据类型为int ***

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

猜你喜欢

转载自blog.csdn.net/qq_40544107/article/details/113825546
今日推荐