这个程序中& a [0]和a之间有什么区别?

时间:2012-08-03 09:44:36

标签: c arrays multidimensional-array

我有一个程序如下......我有一个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之间的区别是什么?

3 个答案:

答案 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个字节,则可以解释观察到的结果。