“多维数组指针+1”的值不匹配

时间:2014-06-12 11:38:27

标签: c arrays pointers

以下是问题计划:

#include <stdio.h>
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

我认为维度的值应该是5,因为t是最后一个维度,事实匹配(0xbfa44004-0xbfa44000 + 1 = 5)

但是r的维度值是 0xbfa44014-0xbfa44000 + 1 = 21,我认为应该是3 * 5 = 15 ,因为3和5是最后一个两个维度,那么为什么差异是21?

2 个答案:

答案 0 :(得分:4)

r是一个指向5个int数组的指针。

假设1 int是你系统上的4个字节(来自tt+1),那么将指针“踩”1(r+1)意味着增加5 * 4 = 20个字节。这就是你在这里得到的。

答案 1 :(得分:1)

您会被C语法欺骗。 r是一个int数组的数组指针t是一个普通的int指针。在进行任何类型的指针运算时,可以在指向的单位进行。

因此t+1表示t的地址+一个指向对象的大小。由于int和int的t点在系统上是4个字节,因此从t获得4个字节的地址。

同样的规则适用于r。它是一个指向5 int数组的指针。当你通过r+1对它进行指针运算时,你会得到指向对象的大小,其大小为5*sizeof(int),恰好是你计算机上的20个字节。因此r+1r提供了一个20字节(== 14十六进制)的地址。