C標準說明如何在表達式中使用數組(取自C99 6.3.2。1/3「左值,數組和功能指示符):
除了當它是sizeof運算符的操作數或一元& 操作者,或是用於初始化數組文本字符串, 表達具有類型'類型的數組「」被轉換成 表達類型「指向數組對象
這通常被稱爲「陣列衰減的初始 元件」指針爲類型「」指針「
所以在以下較大的表達式的子式a
計算結果爲指針爲int:
在更簡單的表達式,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*
的結果。
但是&a和&a [0]屬於同一類型,不是嗎? – Siddharth
基本上,&a [0]的類型是int *,但&a的類型是int(*)[5]。它就像一個指向五個int的單個巨大對象的指針。因此不可能轉換。 – elephant
那麼有沒有什麼辦法可以在不使用&num [0]或num的情況下提取num的第一個地址的值? – Siddharth