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

关于C语言二维数组与指针的疑问:为何三个printf输出地址相同?

二维数组地址值相同的原因解析

先看你的代码:

int td[][3] = {{1,2,3},{4,5,6}};
printf("%p\n", td[0]);
printf("%p\n", &td[0]);
printf("%p\n", &td[0][0]);

这三个printf输出相同地址值的核心原因是:它们指向内存中同一个起始位置,但各自的指针类型完全不同,只是地址值重合而已。具体拆解:

  • td[0]:td[0]是二维数组里的第一个一维数组(类型为int[3])。当数组名作为右值使用时,会自动转换为指向数组首元素的指针,也就是int*类型,指向td[0][0],地址值就是整个数组的起始地址。
  • &td[0]:这里是对第一个一维数组td[0]取地址,得到的是指向这个一维数组的指针,类型为int (*)[3](指向包含3个int的数组的指针)。这个指针的地址值就是该一维数组的起始位置,也就是整个二维数组的起始地址,和上面的地址值完全重合。
  • &td[0][0]:直接取第一个元素的地址,类型为int*,地址值自然是数组的起始地址。

虽然地址值相同,但类型不同会导致指针运算的结果差异很大:

  • td[0] + 1:会移动sizeof(int)字节(通常4字节),指向td[0][1]。
  • &td[0] + 1:会移动sizeof(int[3])字节(通常12字节),指向td[1]的起始位置。

内容的提问来源于stack exchange,提问作者lemonades

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:51:00