核心區別
| 表達式 | 類型 | +1 的意義 | 地址增量 |
|---|---|---|---|
&a | int(*)[5](數組指針) | 跨越整個數組 | +5×sizeof(int)=20字節 |
a | int*(元素指針) | 指向下一元素 | +sizeof(int)=4字節 |
(int)a | int(整數) | 整數加1 | +1字節 |
a[0] a[1] a[2] a[3] a[4] |----|----|----|----|----| ^a ^a+1 ^&a+1 &a 指向整個數組,&a+1 指向數組後緊鄰位置
ptr1 = (int*)(&a+1):指向數組末尾後的int*,ptr1[-1]即a[4] = 5ptr2 = (int*)((int)a+1):將首地址強轉為整數+1,再轉回int*,指向a[0]的第2個字節(小端模式下為0x00)&a = 0x7fff0000 &a+1 = 0x7fff0014 (+20字節) a = 0x7fff0000 a+1 = 0x7fff0004 (+4字節) (int)a+1 = 0x7fff0001 (+1字節) ptr1[-1] = 5, *ptr2 = 0 (a[0]=1, 低字節在前,第二字節為0)
&a類型是數組指針,步長=整個數組大小a退化為首元素指針,步長=元素大小(int)a變為整數運算,失去類型語義ptr1[-1]技巧:反向訪問數組最後一個元素這道題精準考察數組名退化規則、指針類型決定算術步長、強制類型轉換語義改變——是C指釖功力的試金石。