多级指针其实就是在一个地址对应的空间里存放着另一个地址,通过地址一次次跳转,最终找到存着真实数据的那个地址,并通过***p3找到了地址a里面的数据——200
指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。p1 是一级指针,指向普通类型的数据,定义时有一个*;p2 是二级指针,指向一级指针 p1,定义时有两个*,再定义一个三级指针 p3,让它指向 p2,那么可以这样写:int ***p3 = &p2;
其具体意思如下程序所示
#include <stdio.h>
int main(){
int a=200;
int *p = &a;//p中存储的是a的地址,*p=a
int **p2 = &p;//p2中存储的是p的地址,*p2=p=&a,*(*p2)=*p=a
int ***p3 = &p2;
//p3中存储的是p2的地址,*p3=p2=&p,*(*p3)=*p2=p1=&a,*(*(p3)) = *(*p2)=*p=a
printf("a= %d, *p= %d, **p2 = %d, ***p3= %d\n\n",a,*p,**p2,***p3);
printf("*p2=p=&a\n*p2 = %#x, p = %#x,&a = %#x\n\n",*p2,p,&a);//*p2=p=&a
printf("*p3=p2=&p\n*p3=%#x, p2 = %#x, &p = %#x\n\n",*p3,p2,&p);//*p3=p2=&p
printf("**p3=*p2=p=&a\n**p3=%#x, p2 = %#x, &p = %#x\n\n",**p3,*p2,p,&a);//**p3=*p2=p=&a
printf("***p3=a\n***p3 = %d, a = %d\n",***p3,a);//***p3=a
return 0;
}
输出为:
a= 200, *p= 200, **p2 = 200, ***p3= 200
*p2=p=&a
*p2 = 0xc00320e8, p = 0xc00320e8,&a = 0xc00320e8
*p3=p2=&p
*p3=0xc00320e0, p2 = 0xc00320e0, &p = 0xc00320e0
**p3=*p2=p=&a
**p3=0xc00320e8, p2 = 0xc00320e8, &p = 0xc00320e8
***p3=a
***p3 = 200, a = 200