多级指针的语法:
#include <stdio.h>
void main(){
int i = 1000;
//一级指针
int *p = &i;
//二级指针
int **pp = &p;
printf("i的地址%#x,i的值=%d\n",&i,i);
printf("一级指针的地址%#x,p的值=%#x,*p的值=%d\n",&p,p,*p);
printf("二级指针的地址%#x,p的值=%#x,**p的值=%d\n",&pp,pp,**pp);
}
指针级数从语法上来说没有限制,但是推荐最多只定义三级,因为定义的多了,连程序员自己都搞不清了。
运行结果:
i的地址0x62fe4c,i的值=1000
一级指针的地址0x62fe40,p的值=0x62fe4c,*p的值=1000
二级指针的地址0x62fe38,p的值=0x62fe40,**p的值=1000
根据结果我们可以看出,一级指针的值为i的内存地址,二级指针的值为指针变量p的内存地址。这里我们可以强调一个概念:
指针即内存地址,内存地址即指针。
我们从语法上来分析一下指针。
int i = 1000;
//一级指针
int *p = &i;
第一:我们定义了一个变量i i的值为1000.
第二:我们定义了一个指针变量,指针变量的值为i的内存地址。
接着我们输出一下:
printf("一级指针的地址%#x,p的值=%#x,*p的值=%d\n",&p,p,*p);
结果:
i的地址0x62fe4c,i的值=1000
一级指针的地址0x62fe40,p的值=0x62fe4c,*p的值=1000
从结果我们可以得出几个重要点:
一:指针变量本身就是个变量,和i一样,需要开辟一个属于自己的内存。
二:输出指针变量p发现,p的值为0x62fe4c,也就是存储的是i的内存地址。
三:输出*p发现,输出的是i变量的值1000。所以我们的 * 号并不光表示一个指针,它是一个动词,出现一次 * 就代表进行了一次指针运算,何为一次指针运算?就是拿到这个指针变量所存储的值(一定是一个内存地址),再通过这个值找到对应的值。这样的一次行为就是一次指针运算。所以我们的上述代码的行为就是,拿到p的值0x62fe4c再到这个内存地址取到这个地址内的东西1000,。
我觉得,只要理解我所说的 * 这个东西是出现一次就代表着一次指针运算,而一次指针运算代表着拿到一个地址并取出这个地址对应的值这样一次行为,就可以完全搞懂多级指针了。