int a[2][5] 佔用 2×5×sizeof(int) 位元組,邏輯上可視為 2 個長度 5 的一維陣列。int a[2][5]:
int 值。int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
int (*p)[5]; // 指向「長度 5 的 int 陣列」的指標
p = a; // 等同 p = &a[0]
/* a[1][2] 等價寫法 */
printf("%d\n", a[1][2]); // 8
printf("%d\n", *(*(p+1)+2)); // 8
| 運算式 | 值(位址) | 型別 |
|---|---|---|
a | 陣列起始位址 | int (*)[5] |
&a | 陣列起始位址 | int (*)[2][5] |
a[0] | 第 0 列起始位址 | int * |
&a[0] | 第 0 列起始位址 | int (*)[5] |
a[0][0] | 第一個元素值 | int |
&a[0][0] | 第一個元素位址 | int * |
結論:數值上皆相等,但型別不同,決定指標運算步長(+1 跳躍多少位元組)。
int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
int (*p1)[5]; // 陣列指標
int *p2; // 普通指標
p1 = a; // 指向整個二維陣列的第一列
p2 = a[0]; // 指向第一列的第一個元素
/* 透過 p1 存取 */
*(*(p1+0)+2) → a[0][2] = 3
*(*(p1+1)+2) → a[1][2] = 8
/* 透過 p2 存取(視為一維) */
*(p2+2) → a[0][2] = 3
*(p2+4) → a[0][4] = 5
int (*p)[N] 陣列指標操作二維陣列。註:學習筆記摘自朱有鵬老師物聯網視頻教程。