1. 程式人生 > 其它 >C語言——陣列名、取陣列首地址的區別(1)

C語言——陣列名、取陣列首地址的區別(1)

(1)可以發現array和&array的值是一樣的,都是0012FF34。對array+1,結果不是簡單的加法那樣,即並不是0012FF35,而是0012FF38;由於array[0]和array一樣,都是陣列首元素的首地址,+1後的結果相同。然而,&array+1的結果卻是0012FF48。另外,分別對array和&array求位元組長度發現是一樣的(結果20是一個十進位制數)。

(2)這裡會涉及到一下幾點知識:

    • 一般情況下宣告一個數組之後,比如int array[5],陣列名array就是陣列首元素的首地址,而且是一個地址常量。但是,在函式宣告的形參列表中除外。
    • 在C中, 在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量,也就是陣列第一個元素的地址。 它的型別取決於陣列元素的型別: 如果它們是int型別,那麼陣列名的型別就是“指向int的常量指標“。——《C和指標》
    • 在以下兩中場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符&的運算元時。 sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。 取一個數組名的地址所產生的是一個指向陣列的指標,而不是一個指向某個指標常量的指標。所以&a後返回的指標便是指向陣列的指標,跟a(一個指向a[0]的指標)在指標的型別上是有區別的。——《C和指標》
    • “+1”就是偏移量問題:一個型別為T的指標的移動,是以sizeof(T)為移動單位。
      即array+1:在陣列首元素的首地址的基礎上,偏移一個sizeof(array[0])單位。此處的型別T就是陣列中的一個int型的首元素。由於程式是以16進製表示地址結果,array+1的結果為:0012FF34+1*sizeof(array[0])=0012FF34+1*sizeof(int)=0012FF38。
      即&array+1:在陣列的首地址的基礎上,偏移一個sizeof(array)單位。此處的型別T就是陣列中的一個含有5個int型元素的陣列。由於程式是以16進製表示地址結果,&array+1的結果為:0012FF34+1*sizeof(array)=0012FF34+1*sizeof(int)*5=0012FF48。注意1*sizeof(int)*5(等於00000014)要轉換成16進位制後才能進行相加。