int a[2][2] = {2,6,1,9};
int *p;
for (p = a; p < a+4; p++) // 錯誤:a 是行指針,a+4 越界
printf("%d\n", *p);
int a[2][2] = {2,6,1,9};
int *p = a; // p 指向首元素 a[0][0]
for (int i = 0; i < 4; i++)
printf("%d\n", *(p + i)); // p+i 逐元素偏移
| 表達式 | 類型 | +1 的含義 | 示例值 |
|---|---|---|---|
a | int (*)[2] 行指針 | 跳過一整行(2 個 int) | a+1 == &a[1][0] |
p (int*) | int* 元素指針 | 跳過一個 int | p+1 == &a[0][1] |
a 是指向「含 2 個 int 的數組」的指針,a+4 指向第 4 行(即 &a[4][0]),但數組只有 2 行 → **越界訪問**,行為未定義。p = a 發生隱式轉換:行指針轉為元素指針,指向首元素,隨後 p+i 正確遍歷所有 4 個元素。// 方法一:元素指針(推薦)
int *p = &a[0][0];
for (int i = 0; i < rows * cols; i++) use(*(p+i));
// 方法二:雙重循環(最清晰)
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
use(a[i][j]);
// 方法三:行指針
int (*prow)[cols] = a;
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
use(prow[i][j]);
記住:**二維數組名是行指針,步長為行大小;轉為元素指針後步長為元素大小。**