二維陣列與指標
int a[4][5] = {{1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}, {1,2,3,4,5}};
// 記憶體連續:第 0 列 5 個 int,接著第 1 列 ...
// 取元素位址
&a[i][j] // 第 i 列第 j 行元素位址
// 陣列名轉型
int (*p)[5] = a; // p 指向「含 5 個 int 的陣列」,型別 int (*)[5]
p[i] 等價 a[i] // p+i 偏移 i*5*sizeof(int) 位元組
指標的指標(雙重指標)
char *names[] = {"China", "Beijing", "Longmai"};
char **pp = names; // pp 指向 names[0] 的位址
pp[0] == names[0] // "China"
pp[1] == names[1] // "Beijing"
// 常見用途:函數修改呼叫端的指標變數、動態二維陣列、main 的 argv
字串指標陣列遍歷
char *cmd[] = {"ls", "-l", "/home", NULL};
for (char **p = cmd; *p; p++) {
printf("arg: %s\n", *p);
}
記憶體圖解關鍵點
a、&a[0]、&a[0][0] 數值相同,**型別不同**;
a+1 跳過整列(5*sizeof(int)),&a[0]+1 同理;
*(a+i)+j 等價 a[i][j];
- 二維陣列**不是**
int **,切勿強轉。