| 表達式 | 類型 | 值(地址) | 含義 | +1 後增量 |
|---|---|---|---|---|
a | int * | 首元素地址 | 退化為指向首元素的指針 | sizeof(int) (4) |
&a[0] | int * | 首元素地址 | 顯式取首元素地址 | sizeof(int) (4) |
&a | int (*)[N] | 首元素地址 | 指向整個數組的指針 | sizeof(int[N]) (N*4) |
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)
void foo(int *p); // 接收 a 或 &a[0] void bar(int (*p)[5]); // 接收 &a,保留長度信息,編譯器檢查邊界
int *p, size_t len 組合,靈活通用。int (*p)[N]。int a[3][4]; a --> int (*)[4] (指向 4 元素數組的指針) *a --> int * (指向首行首元素) **a --> int (首元素值)
&a 參與指針運算除非明確需要「跨越整個數組」,否則易導致越界訪問。
核心規則:根據發音而非拼寫決定。
an:an hour (h 不發音)、an honest man。a:a university (/j/ 音)、a European (/j/)、a one-eyed (/w/)。a, e, f, h, i, l, m, n, o, r, s, x。如 an F、an M、an X。