关于C语言中双指针(double pointer)打印地址的疑问
双指针打印结果的疑问解析
关键要点:指针的「自身地址」和「存储值」是两回事
在C语言里,直接打印指针变量名时,输出的是它存储的地址值,而不是变量自己在内存中的地址。不管是一级指针还是多级指针,这个规则都适用。你混淆了指针变量本身的内存位置,和它所指向的地址这两个概念。
拆解你的代码逻辑
先理清变量间的指向关系:
a是int数组,数组名a在多数场景下会转换成指向a[0]的指针p是指针数组,每个元素都是int*类型,分别存储a、a+1…这些地址pp是int**类型的双指针,初始化时被赋值为p,也就是存储了指针数组p的首地址
关于p的输出解释
- 打印
p:数组名p会转换为指向其首元素的指针,所以输出的是p这个数组的首地址(也就是你看到的"address of p") - 打印
*p:*p取的是p数组的第一个元素,也就是a,所以输出a的地址("address of a") - 打印
**p:*(*p)等价于*a,也就是数组a的第一个元素值0
关于pp的输出解释
- 打印
pp:pp是一个变量,它存储的值是p的首地址,所以直接打印pp就输出这个存储的地址("address of p") - 如果你想打印
pp自身的地址,得用&pp——这才是pp这个变量在内存中自己的位置 - 打印
*pp:*pp取的是pp指向的内容,也就是p数组的第一个元素a,所以输出a的地址 - 打印
**pp:最终访问到a[0],所以值为0
验证修改示例
如果要看到pp自身的地址,可以修改printf语句:
printf("pp自身地址: %p, pp存储的地址: %p, *pp: %p, **pp: %d\n", &pp, pp, *pp, **pp);
此时&pp输出的就是pp变量自己的内存地址,而pp依旧输出它所指向的p的地址。
内容的提问来源于stack exchange,提问作者Thomas Bollinger
相关产品推荐
相关产品推荐

