二維數組 int a[3][4] 可視為 3 個一維數組組成的數組:a[0]、a[1]、a[2],每個含 4 個 int 元素。內存按行主序連續存放。
假設首地址為 1000,int 佔 2 字節(16位環境):
a → 1000(第 0 行首地址)a+1 → 1008(第 1 行首地址,跨過 4 個 int)a+2 → 1016(第 2 行首地址)行指針與元素地址:
a[i] 等價 *(a+i) → 第 i 行首地址(&a[i][0])a[i]+j 等價 *(a+i)+j → 第 i 行第 j 列元素地址(&a[i][j])a[i][j] 等價於:
*(a[i]+j)*(*(a+i)+j)(*(a+i))[j]a 與 *a 值相同?a 是二維數組首地址(第 0 行地址)。*a 解引用得到第 0 行數組名 a[0],而數組名在表達式中退化為首元素地址 &a[0][0]。兩者數值相同但類型不同:
a 類型:int (*)[4](指向 4 個 int 的數組指針)*a 類型:int *(指向 int 的指針)int (*p)[4] = a; // p 指向包含 4 個 int 的數組
// p+i → 第 i 行
// *(p+i)+j → a[i][j] 地址
// *(*(p+i)+j) → a[i][j] 值
掌握二維數組指針運算是處理矩陣、圖像數據、多維數據結構的基礎。