引言:在学习C/Cpp指针部分的时候,有许多地方是比较容易让人懵逼的,今天我们来讨论多级指针的话题
在进入今天的话题前,我们先来思考几个问题:如何定义一个指针来保存另一个变量的地址?
答案很明显
对应变量的数据类型 * 指针变量名 =&变量名(即在需要指向的变量类型基础上加个)*
例如: int a=10;
int p=&a;//定义一个int类型的指针p指向a ;其中,号表示这是一个指针类型,int表示这个指针是int型的,p才是指针变量的名称
以此为例,我们进行推广:定义一个指向指针p的指针变量,即在int的后面再加一个
int q=&p; *//指针q里面,保存了指针p的地址!由于p本身就是一个指针,那么,指向一级指针的指针,我们称为二级指针,是几级指针,在定义时就有几个星号,以此类推。
int t=&q;//定义一个指针,保存指针q的地址。
看到这里,一切都还比较容易理解。我们需要提出几个注意:
(1)在读代码的时候,对于多级指针,我们要关心的,不是这个指针符号前面有多少个号,而是看它的上一级是谁(看给多级指针赋值时赋值号的右边是谁,谁就是他的上一级),即指向了谁
(2)对于多级指针的解引用我们按照分级法进行读取,必要时用画图的方法帮助我们理解.
(3)指针也是一个变量,故可以对他进行赋值
(4)指针指向谁,就把谁的地址赋给指针
(5)p指针变量名操作的是指针p指向的内存
我们来举几个例子:
int a=10;
int * p=&a;
int ** q=&p;
int *** t=&q;
int **** m=&t;
试解释: *m,**m,***m,****m,代表的各是什么含义。
分析方法:画图并对星号进行逐级分析。
画图以明确各个指针的指向
图片
在图片的帮助下,我们一目了然各个指针的指向,接下来逐级分析星号即可:
我们只关心一个指针的上一级是谁(看赋值号右边),如,m存储的是t的地址,故他的上一级是t
*m ——>对指针m进行一级解引用:由图可知 m保存了 t的地址,故 *m的值为指针t(即q的地址)
m ——>对指针m进行二级解引用: 由间接寻址符“ * ”的含义我们知道 m实际上是t 于是这里等价于t故m的值是指针q(即p的地址)
m ——>对指针m进行二级解引用,由间接寻址符 “ * ” 的
含义,以及上面的分析,我们知道 **m实际上是指针q 于是这里等价于q故m的值是指针p(即a的地址)
**m 同理可知 m是指针p这里等价于p,即变量a,故m的值为10
例:
int **********************p;
int ***********************q=&p;//q是比p更高一级的指针
p=0x00111;//让指针p指向编号为0x00111的地址
*q=0xaabb;//我们不关心q在定义时前面有多少个星号,我们由指针q的定义知道q指向了指针p,即q的上一级是p,即q里保存了p的地址,现操作p指向的内存中的值,即让p=0xaabb
printf(“p的值为:%p”,p);//0xaabb
p=0xbbcc;//编译错误!因为p操作的是指针p指向的内存,而在定义p时,并未使其指向任何内存,因为编号为0xbbcc的内存是非法的。故这里试图操作野指针出错(在linux系统中会提示段错误。)