- #include <stdio.h>
-
- int main(){
- int a =100;
- int *p1 = &a;
- int **p2 = &p1;
- int ***p3 = &p2;
-
- printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);
- printf("&p2 = %#X, p3 = %#X\n",&p2, p3);
- printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n",&p1, p2,*p3);
- printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n",&a, p1,*p2,**p3);
- return0;
- }
-
- 运行结果:
100, 100, 100, 100
&p2 = 0X28FF3C, p3 = 0X28FF3C
&p1 = 0X28FF40, p2 = 0X28FF40, *p3 = 0X28FF40
&a = 0X28FF44, p1 = 0X28FF44, *p2 = 0X28FF44, **p3 = 0X28FF44
以三级指针 p3 为例来分析上面的代码。***p3
等价于*(*(*p3))
。*p3 得到的是 p2 的值,也即 p1 的地址;*(*p3) 得到的是 p1 的值,也即 a 的地址;经过三次“取值”操作后,*(*(*p3)) 得到的才是 a 的值。
假设 a、p1、p2、p3 的地址分别是 0X00A0、0X1000、0X2000、0X3000,它们之间的关系可以用下图来描述: