int arr[5] = {1,2,3,4,5}; // 編譯器分配20字節連續空間,不可縮放
&arr:數組首地址(類型int(*)[5],步長20字節)。&arr[0]:首元素地址(類型int*,步長4字節)。arr等價&arr[0],表示首元素地址。arr不可賦值(地址不可修改),故arr = p非法。兩者均可用指針算術(*(p+i))或下標(p[i])訪問。編譯器將a[b]統一翻譯為*(a+b)。
區別在於定義時的內存佈局:指針變量單獨佔用空間存地址;數組直接佔用元素空間。
&arr + 1 vs arr + 1&a + 1:按數組類型步長(5*sizeof(int))跳躍。a + 1 / &a[0] + 1:按元素類型步長(sizeof(int))跳躍。| 聲明 | 名稱 | 含義 | 優先級結合 |
|---|---|---|---|
int *p[5]; | 指針數組 | 含5個int*元素的數組 | [ ] > * → (p[5]) 先結合 |
int (*p)[5]; | 數組指針 | 指向int[5]類型的指針 | ( ) > [ ] → (*p) 先結合 |