2

这是我的代码:-

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);


}

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

4

3 回答 3

3

当您将a类型传递int (*)[4]给期望int *. 如果您打开所有编译器警告,您会看到这一点。

我的编译器明确指出:

警告:从不兼容的指针类型传递“显示”的参数 1

忠告:当你的编译器抱怨你的代码时,你最好注意它。学习使用所有编译器标志(-Wall -pedantic等) - 这将在大多数不良编码习惯变得根深蒂固之前抓住它们。或者有一天他们会咬你。

于 2013-10-15T23:03:25.620 回答
1

它们有不同的尺寸,所以移到下一个会增加不同的数量。如果您使用int指针和char指针,也会发生同样的事情——因为它们具有不同的大小,将一个添加到相同的地址会给您不同的地址。

于 2013-10-15T23:02:20.037 回答
0

要编译代码,您必须将最后一条语句更改为display(&a[0][0]). 原因是数组衰减没有重复应用,所以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 + 4forpX + 16for a。在我的机器上,p + 1= 0x22fe34,而a + 1= 0x22fe40。

于 2013-10-16T00:07:24.457 回答