2

我在下面有一个程序......我有一个 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

4

3 回答 3

2

它们是等价的表达式。

a + 1&a[0] + 1值是相同的,它们都是 type int (*)[2]

请注意,您没有正确打印指针值:使用p转换说明符并将参数转换(void *)为打印指针的值:

printf("%p\n", (void *) (a + 1)); 
printf("%p\n", (void *) (&a[0] + 1)); 
printf("%p\n", (void *) (a[2]));
于 2012-08-03T09:45:18.313 回答
1

您的编译器似乎有错误。如果a命名一个数组,那么在 [大多数] 表达式中a并且&a[0]应该具有相同的类型和值,因此+1在两种情况下的结果应该是相同的。

a+1并且&a[0]+1都应该等价于&a[1]

为了在测试时严格正确,您应该将%p其用作显示指针值的格式说明符。

于 2012-08-03T09:50:16.750 回答
0

a命名数组int a[3][2],所以它有类型int [3][2]。在表达式a + 1中,它衰减为指向第一个元素的指针,因此它的类型为int (*)[2]

在表达式&a[0]中,a再次衰减为类型的指针,类型也是int (*)[2]如此。address-of 运算符是一种特殊情况,因为它不会引发指针衰减,因此具有 type并且具有与 decayed 相同的类型和值。a[0]int [2]&a[0]int (*)[2]a

猜测一下,我推测您的编译器错误地衰减a[0]in &a[0],因此它给出&a[0]了 type int **。如果您平台上的数据指针大小为 4 个字节,那么这将解释观察到的结果。

于 2012-08-03T10:20:45.203 回答