这是我的代码: -
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不应指向相同的地址吗?
答案 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表示指针a
和p
的不同值。
虽然a
和p
的实际值与数组/第一个值位置(称为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。