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

C语言二维数组指针运算:为何a+1与*(a+1)输出同地址?

二维数组指针运算与解引用的原理解析

先拆解核心逻辑,一步步解释你的问题:

1. 二维数组名a的本质

在C语言中,数组名在多数场景下会自动退化为指向数组第一个元素的指针。对于int a[3][3]:

  • a的第一个元素是一维数组a[0](类型为int[3]),所以a退化成的指针类型是int (*)[3]——也就是「指向包含3个int的数组的指针」。

2. a+1的指针运算逻辑

指针运算的步长由指针类型决定:

  • a的类型是int (*)[3],每一步的步长是一个int[3]的大小。假设int占4字节,一个int[3]的大小就是3*4=12字节。
  • 已知基地址是100,a+1会跳过一个int[3]的空间,计算得100+12=112,所以printf("%p", a+1)输出112。

3. *(a+1)的解引用逻辑

解引用a+1得到的是a[1]——二维数组的第二个一维数组。
但注意:一维数组名a[1]作为右值时,同样会退化为指向它第一个元素的指针,也就是&a[1][0],而这个地址正好是112(a[1]的起始地址)。
所以用%p格式符打印时,输出的是这个退化后的指针地址,自然也是112。

4. 为什么不是输出对应整数值?

如果想获取112地址对应的整数值,需要再做一次解引用:

  • 用**(a+1)或者*(a[1]),这时候才会拿到a[1][0]的值0。
  • 你当前的*(a+1)只是退化后的一维数组指针,不是具体数值,所以%p打印的是地址而非数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:42:48