将2D数组传递给C中的函数

时间:2013-10-15 23:01:06

标签: c pointers multidimensional-array

这是我的代码: -

void display(int *p)
{ 
 printf ("%u\n", p);
 printf ("%u\n", p+1);
}

int main()
{
  int a[3][4] = {
                  1,2,3,4,
                  5,6,7,8,
                  9,0,1,2
                };
  printf("%u\n",a);
  printf("%u\n",a+1);
  display(a);


}

为什么+ 1和p + 1给出不同的地址?如果a和p给出相同的地址,那么+ 1和p + 1不应指向相同的地址吗?

3 个答案:

答案 0 :(得分:3)

当您将类型为a的{​​{1}}传递给期望int (*)[4]的函数时,您的编译器应该抛出错误(或至少是警告)。如果你打开所有编译器警告,你会看到这个。

我的编译器明确指出:

  
    

警告:从不兼容的指针类型

传递'display'的参数1   

建议:当您的编译器抱怨您的代码时,您应该注意它。学习使用所有编译器标志(int *等) - 这将在它们根深蒂固之前捕获大多数不良的编码习惯。或者有一天他们会咬你。

答案 1 :(得分:1)

它们具有不同的尺寸,因此移动到下一个尺寸会增加不同的数量。如果您使用int指针和char指针,则会发生同样的情况 - 因为它们具有不同的大小,在同一地址中添加一个将为您提供不同的地址。

答案 2 :(得分:0)

要编译代码,您必须将最后一个语句更改为display(&a[0][0])。原因array decay未重复应用,因此int[3][4]变为int(*)[4]。一旦你使代码可编辑,你就会看到你问的问题:递增1表示指针ap的不同值。

虽然ap的实际值与数组/第一个值位置(称为X)的基址相同,但需要注意的是两个指针都是不同的类型; p的类型为int*,而int (*) [4]是指向二维数组的指针的类型(因为数组衰减仅适用于第一维。在伪代码中

  

p + 1 = X + sizeof(int)

     

a + 1 = X + sizeof(int(*)[4])= X +(sizeof(int)* 4)

其中4是数组的第二个维度。因此,在sizeof(int)为4的计算机上,您会看到X + 4的{​​{1}}和p的{​​{1}}。在我的机器上,X + 16 = 0x22fe34,而a = 0x22fe40。