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
相关产品推荐
相关产品推荐

