上一讲指针链接:
指针第四部分(野指针、空指针、万能指针)---- 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
关键字,分别修饰*p
和p
。所以我们不能通过*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
的地址,即&a
。q
保存的是p
的地址,即&p
。那么*q代表提取其指针变量所指向的那块内存空间的内容,即*q = &a
。在刚开始已经说了,另一种保存了a
的地址为指针变量p
,所以*q
和p
某种意义上是等价的。所以有了如下分析:
**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 ***
。
结束语
如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!