首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C/C++ 陣列名、首元素地址、陣列指標三者關係圖解

     編輯:程式設計疑難解答

核心結論

陣列名在大多數表達式中退化為指向首元素的指標 (`T*`),其值等於 `&array[0]`;但 `&array` 型別為 `T(*)[N]`(陣列指標),雖然數值相同,語義與運算行為不同。

程式碼驗證

int a[10] = {1,2,3,4,5,6,7,8,9,10};
printf("a      = %p\n", (void*)a);        // 首元素地址
printf("&a[0]  = %p\n", (void*)&a[0]);    // 首元素地址
printf("&a     = %p\n", (void*)&a);        // 陣列整體地址(數值相同)
printf("a+1    = %p\n", (void*)(a+1));    // 移動 sizeof(int) 位元組
printf("&a+1   = %p\n", (void*)(&a+1));   // 移動 sizeof(int[10]) 位元組

型別差異表

表達式型別解引用結果+1 偏移量
`a` / `&a[0]``int*``int` (首元素值)`sizeof(int)`
`&a``int(*)[10]``int[10]` (整個陣列)`sizeof(int[10])`

實戰應用

  • 函式參數:`void foo(int *p)` 或 `void foo(int arr[])` 皆可接收陣列,內部無法得知長度,需額外傳長度。
  • 二維陣列傳參:`void foo(int arr[][COL])` 或 `void foo(int (*arr)[COL])`,必須指定次維度。
  • `sizeof(a)` 在陣列定義處得整個陣列大小;在函式參數處 `a` 已退化為指標,`sizeof(a)` 得指標大小 (4/8 位元組)。

結語

「陣列名是首元素地址」是對「陣列名在表達式中退化為指向首元素的指標」的口語簡化。深入理解退化規則、型別差異與 `sizeof` 語境敏感性,是寫出正確 C/C++ 陣列操作的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved