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