2012-08-03 48 views
2

我有以下程序...我有一個Turbo C的編譯器,int爲2個字節..這個程序中的&a [0]和a之間的區別是什麼?

#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之間的區別?

+1

你爲什麼不檢查'if(a ==&a [0])' – bugwheels94 2012-08-03 09:48:08

回答

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

你的編譯器似乎有一個bug。如果a命名數組,那麼在[大多數]表達式中,a&a[0]應該具有相同的類型和值,因此+1的結果在兩種情況下都應該是相同的。

a+1&a[0]+1應該都等於&a[1]

測試時應嚴格正確地使用%p作爲顯示指針值的格式說明符。

+0

它們都具有相同的值但遞增...他們有不同的值... – 2012-08-03 09:52:23

+0

@AmolSingh:是的,但他們應該因爲他們也有相同的類型。 – 2012-08-03 09:56:36

0

a將數組命名爲int a[3][2],因此它的類型爲int [3][2]。在表達式a + 1中,它衰減到指向第一個元素的指針,因此它的類型爲int (*)[2]

在表達式&a[0]a再次衰變到int (*)[2]類型的指針,所以a[0]具有類型int [2]。地址 - 運算符是一種特殊情況,因爲它不會引起指針衰減,所以&a[0]的類型爲int (*)[2],並且具有與衰減的a相同的類型和值。

在猜測,我猜測你的編譯器錯誤地衰減a[0]&a[0],所以它給&a[0]類型int **。如果您的平臺上的數據指針大小爲4個字節,那麼這將解釋觀察結果。

相關問題