我有一个程序如下......我有一个turbo c编译器,所以int
是2个字节..
#include<stdio.h>
main()
{
int a[3][2]={
{1,3},
{2,0},
{3,4}
};
printf("%d",(a+1)); //increments 2 bytes
printf("%d",(&a[0]+1)); // increments 4 bytes
printf("%d",(a[2]));
return 0;
}
a+1
和&a[0]+1
之间的区别是什么?
答案 0 :(得分:2)
他们是同等的表达。
a + 1
和&a[0] + 1
值相同且均为int (*)[2]
类型。
请注意,您没有正确打印指针值:使用p
转换说明符并将参数强制转换为(void *)
以打印指针的值:
printf("%p\n", (void *) (a + 1));
printf("%p\n", (void *) (&a[0] + 1));
printf("%p\n", (void *) (a[2]));
答案 1 :(得分:1)
您的编译器似乎有错误。如果a
命名数组,则[大多数] [{1}}和a
中的&a[0]
和+1
应具有相同的类型和值,因此a+1
的结果在两种情况下都应相同。
&a[0]+1
和&a[1]
都应该等同于%p
。
要在测试时严格正确,您应该使用{{1}}作为显示指针值的格式说明符。
答案 2 :(得分:0)
a
为数组int a[3][2]
命名,因此它的类型为int [3][2]
。在表达式a + 1
中,它衰减为指向第一个元素的指针,因此该类型为int (*)[2]
。
在表达式&a[0]
中,a
再次衰减为int (*)[2]
类型的指针,因此a[0]
的类型为int [2]
。 address-of运算符是一种特殊情况,因为它不会引起指针衰减,因此&a[0]
具有类型int (*)[2]
并且具有与衰减a
相同的类型和值。
猜测一下,我推测你的编译器在a[0]
中错误地衰减了&a[0]
,因此它给&a[0]
类型int **
。如果平台上的数据指针大小为4个字节,则可以解释观察到的结果。