“多维数组指针+1”的值不匹配
这是问题计划:
#include int main() { int apricot[2][3][5]; int (*r)[5]=apricot[0]; int *t=apricot[0][0]; printf("%p\n%p\n%p\n%p\n",r,r+1,t,t+1); }
它的输出是:
# ./a.out 0xbfa44000 0xbfa44014 0xbfa44000 0xbfa44004
我认为t的维度值应为5,因为t是最后一个维度,事实匹配(0xbfa44004-0xbfa44000 + 1 = 5)
但是r的维度值是0xbfa44014-0xbfa44000 + 1 = 21,我认为它应该是3 * 5 = 15 ,因为3和5是最后两个维度,那么为什么差异是21?
r
是指向5个int的数组的指针。
假设1 int是你系统上的4个字节(从t
和t+1
),那么将指针“踩”1( r+1
)意味着增加5 * 4 = 20个字节。 这就是你在这里得到的。
您会被C语法欺骗。 r
是一个指向 int数组的数组指针 , t
是一个普通的int指针。 在进行任何类型的指针运算时,可以在指向的单位进行。
因此t+1
表示t+1
的地址与一个指向对象的大小。 由于int和int的t点在系统上是4个字节,因此从t
获得4个字节的地址。
r
适用同样的规则。 它是一个指向5 int数组的指针。 当你用r+1
对它进行指针运算时,你会得到指向对象的大小,它的大小为5*sizeof(int)
,恰好是你计算机上的20个字节。 因此, r+1
为r+1
提供了一个20字节(== 14hex)的地址。