首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

數組名、&數組名、&數組首元素:三者區別與指針算術深度解析

     編輯:關於C語言

核心結論速覽

表達式類型值(地址)含義+1 後增量
aint *首元素地址退化為指向首元素的指針sizeof(int) (4)
&a[0]int *首元素地址顯式取首元素地址sizeof(int) (4)
&aint (*)[N]首元素地址指向整個數組的指針sizeof(int[N]) (N*4)

實驗驗證(32 位環境,int a[5])

a           --> 0x004DF870
&a          --> 0x004DF870
&a[0]       --> 0x004DF870

a+1         --> 0x004DF874  (+4  bytes)
&a+1        --> 0x004DF884  (+20 bytes = 5*4)
&a[0]+1     --> 0x004DF874  (+4  bytes)

本質區別圖解

內存佈局:[a[0]][a[1]][a[2]][a[3]][a[4]]
           ^                    ^
           a, &a[0]             &a+1 (數組尾後)

a       : 指向 a[0] 的指針,步長 1 元素
&a[0]   : 同 a,顯式形式
&a      : 指向「整個 5 元素數組」的指針,步長 1 個數組 (20 bytes)

實戰陷阱與最佳實踐

1. 函數參數傳遞

void foo(int *p);        // 接收 a 或 &a[0]
void bar(int (*p)[5]);   // 接收 &a,保留長度信息,編譯器檢查邊界
  • 首選 int *p, size_t len 組合,靈活通用。
  • 需強制長度檢查時用 int (*p)[N]。

2. 多維數組退化

int a[3][4];
a       --> int (*)[4]  (指向 4 元素數組的指針)
*a      --> int *       (指向首行首元素)
**a     --> int         (首元素值)

3. 避免 &a 參與指針運算

除非明確需要「跨越整個數組」,否則易導致越界訪問。

附錄:英文冠詞 a/an 用法(與 C 無關,原文附帶)

核心規則:根據發音而非拼寫決定。

  • 元音音素開頭用 an:an hour (h 不發音)、an honest man。
  • 輔音音素開頭用 a:a university (/j/ 音)、a European (/j/)、a one-eyed (/w/)。
  • 26 字母中發音以元音開頭者(12 個):a, e, f, h, i, l, m, n, o, r, s, x。如 an F、an M、an X。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved