核心概念:陣列名稱的型別與位移單位
陣列名稱在大多數情境下會退化為「指向第一個元素的指標」,但 &arr 保留「整個陣列」的型別。指標運算的位移單位取決於指標的基礎型別。
一維陣列 int a[3] = {1,2,3}
| 運算式 | 型別 | 位移單位 | 位移量(相對 a) |
&a | int (*)[3] | 整個陣列大小 (12 bytes) | 0 |
a / &a[0] | int * | 單一元素 (4 bytes) | 0 |
&a + 1 | int (*)[3] | 12 bytes | +12 bytes(陣列結尾) |
a + 1 / &a[0] + 1 | int * | 4 bytes | +4 bytes(指向 a[1]) |

二維陣列 int a[3][3]
| 運算式 | 型別 | 位移單位 | 位移量 |
&a | int (*)[3][3] | 整個陣列 (36 bytes) | 0 |
a / &a[0] | int (*)[3] | 一列大小 (12 bytes) | 0 |
a[0] / &a[0][0] | int * | 單一元素 (4 bytes) | 0 |
&a + 1 | int (*)[3][3] | 36 bytes | +36 bytes |
a + 1 / &a[0] + 1 | int (*)[3] | 12 bytes | +12 bytes(指向第 2 列) |
a[0] + 1 / &a[0][0] + 1 | int * | 4 bytes | +4 bytes(指向 a[0][1]) |

三層級別總結
- 最高層:
&a —— 整個陣列物件
- 中層:
a、&a[0] —— 第一維(列)
- 最低層:
a[0]、&a[0][0] —— 單一元素
實務應用:函數參數傳遞
// 錯誤:void func(int a[][]) // 編譯錯誤,需知第二維大小
// 正確寫法:
void func1(int a[][3], int rows); // 二維陣列退化為指向「含3個int的陣列」指標
void func2(int (*a)[3], int rows); // 等價寫法
void func3(int *a, int rows, int cols); // 攤平成一維,手動計算索引 a[i*cols + j]
常見錯誤
sizeof(a) 在函數參數中會退化為指標大小,非陣列總大小
- 將
int ** 當作二維陣列傳入(指標陣列 ≠ 二維陣列)