二維陣列概念上有行列,但記憶體中所有元素連續排列,無縫隙。C 語言按行優先儲存:先存第 0 行,再存第 1 行...
int a[3][4] 可視為三個一維陣列 a[0]、a[1]、a[2],每個含 4 個 int 元素。
int (*p)[4] = a;
p 指向類型為 int[4] 的一維陣列(即二維陣列的一行)。() 不可省略,否則 int *p[4] 變成指標陣列。p 指向類型 int[4](16 位元組),p+1 前進 16 位元組 → 指向下一行,p-1 回上一行。
a 在表達式中等價於 pp → 第 0 行地址;p+1 → 第 1 行地址。*(p+1) → 取地址上資料 = 整個第 1 行(多個元素)。*(p+1)+1 → 表達式中行資料轉為首元素地址 → 第 1 行第 1 個元素地址。*(*(p+1)+1) → 取值 → 第 1 行第 1 個元素值。a+i == p+i a[i] == p[i] == *(a+i) == *(p+i) a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)
#include <stdio.h>
int main() {
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
int (*p)[4] = a;
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++)
printf("%2d ", *(*(p+i)+j));
printf("\n");
}
return 0;
}
int *(p1[5]); // 指標陣列,佔 20 位元組 (32位) int (*p2)[5]; // 二維陣列指標,佔 4 位元組
本質不同:前者是陣列(元素為指標),後者是單一指標(指向二維陣列)。