You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:43:32