2014-03-12 112 views
0

我以爲當你試圖獲取一個數組的地址時,它會返回它所保存的第一個元素的地址。作爲數組的地址返回的地址是什麼?

int *j; 
int a[5]={1,5,4,7,8}; 

現在j=&a[0];工作得很好。

即使j=a也執行相同的功能。

但是當我做j=&a它拋出一個錯誤說cannot convert INT(*)[5]」以int*' in assignment

它爲什麼會發生? & a應該是數組a的第一個元素,所以它應該給& a [0]。 但相反,它會引發錯誤。有人可以解釋爲什麼嗎?

回答

0

a&a的類型即使它們包含相同的值,即數組a的基地址也是不相同的。

j = a; 

這裏將數組名a轉換爲指向其第一個元素的指針。

試試,看你通過這些語句得明白其中的區別在於什麼樣的價值觀:

printf("%p", a+1); 
printf("%p", &a+1); 
+0

但是&a和&a [0]屬於同一類型,不是嗎? – Siddharth

+0

基本上,&a [0]的類型是int *,但&a的類型是int(*)[5]。它就像一個指向五個int的單個巨大對象的指針。因此不可能轉換。 – elephant

+0

那麼有沒有什麼辦法可以在不使用&num [0]或num的情況下提取num的第一個地址的值? – Siddharth

0

c是強類型語言。只有在ja屬於同一類型或編譯器可以安全地將a轉換爲j時,才允許分配j=a;。在你的情況下,j的類型是int *,而&a的類型是int (*)[5]。編譯器不知道如何自動將int (*)[5]類型的對象轉換爲int *類型的對象。編譯器正在告訴你這一點。

0

a是5個數字int s。指向a的指針是一個指向五個整數數組的指針,或int (*)[5]。由於指針運算的原因,這與int *不兼容:如果增加int *類型的變量,則變量中的地址將增加4(假設爲4個字節的整數),以便它指向下一個整數。如果增加一個指向一個由5個整數組成的數組的變量,變量中的地址將增加20(再次假定爲4個字節的整數),以便它指向下一個包含5個整數的數組。

也許令人困惑的是,a&a給出的值與您所說的相同。值是相同的,但類型是不同的,並且當您對指針進行算術運算時,差異最明顯。

我希望有幫助。

2

C標準說明如何在表達式中使用數組(取自C99 6.3.2。1/3「左值,數組和功能指示符):

除了當它是sizeof運算符的操作數或一元& 操作者,或是用於初始化數組文本字符串, 表達具有類型'類型的數組「」被轉換成 表達類型「指向數組對象

這通常被稱爲「陣列衰減的初始 元件」指針爲類型「」指針「

所以在以下較大的表達式的子式a計算結果爲指針爲int:

  • j=&a[0]
  • j=a

在更簡單的表達式,j=a,該指針被簡單地分配到j

在更復雜的表達式,j=&a[0]中,「索引」操作者[]被施加到指針(它是一個操作相當於*(a + 0))和操作人員的-的地址'被施加到,從而導致另一個指針int分配給j

在表達式j=&a中,將address-of運算符直接應用於數組名稱,並且我們在上面引用的子句中遇到了一個例外:「除非它是...的一元運算符&運算符」。

現在,當我們在看什麼標準說,關於一元&(地址)的運營商(C99 6.5.3.2/3「地址和間接運算符」):

一元&運算符返回其操作數的地址。如果 操作數的類型爲「type」,則結果的類型爲「指向類型的指針」。

由於a具有類型「5整型陣列」(int [5]),施加&到它直接有類型「指針5 INT的陣列」(int (*)[5]),這是不能分配給int*的結果。

+0

很好的解釋。在函數參數列表中使用數組時,我想指出一個有趣的例子。實際上,一個函數不能有'數組類型'參數,所以它被轉換爲'指向類型'參數的指針。 'int func(int a []);'與'int func(int * a)完全相同;'前面的函數聲明在內部會發生什麼? – ajay

相關問題