“多维数组指针+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个字节(从tt+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+1r+1提供了一个20字节(== 14hex)的地址。