數組名、指針變量、下標運算、指針運算在 C 中有著緊密的等價關係。本文通過代碼演示一維數組的五種訪問寫法、二維數組地址計算規則,幫助建立「數組即指針、指針即數組」的直觀心智模型。
int array[6] = {1,2,3,4,5,6};
int *p = array;
// 1. 數組名 + 下標
for(i=0;i<6;i++) printf("%d ", array[i]);
// 2. 數組名 + 指針運算
for(i=0;i<6;i++) printf("%d ", *(array+i));
// 3. 指針變量 + 下標
for(i=0;i<6;i++) printf("%d ", p[i]);
// 4. 指針變量 + 指針運算
for(i=0;i<6;i++) printf("%d ", *(p+i));
// 5. 指針遞增(最高效,無乘法/加法開銷)
while(p < array+6) printf("%d ", *p++);
前四種編譯後機器碼幾乎相同;第五種省去索引計算,適合極度效能敏感場景。
int b[3][5] = {{31,32,33,24,25},{16,17,8,9,10},{19,11,51,14,15}};
// b : 首行首元素地址(int (*)[5])
// b+1 : 第二行首元素地址,跨越 5*sizeof(int) 字節
// b[0] : 同 b,類型 int*
// b[0]+1 : 第一行第二個元素
// b[1] : 第二行首元素,等價 *(b+1)
// &b[1][0]: 同 b[1]
// b[2][4] : 第三行第五個元素,等價 *(*(b+2)+4)
array[i] 編譯器自動轉為 *(array+i),本質是指針運算。b[row][col] 偏移量 = (row * COLS + col) * sizeof(int)。b 類型為 int (*)[5](指向含 5 個 int 的數組的指針),b+1 步長為整行大小。void func(int arr[][5]) 或 void func(int (*arr)[5])。掌握這些等價關係,能輕鬆閱讀、編寫高效的指針代碼,避免「指針與數組混淆」導致的緩衝區溢出、訪問越界等經典錯誤。