一維數組通路方式
一維數組中 a[i] 中的 a 代表了本數組的首位址,相當于 &a[0]。是以 *a 就等于 a[0]。那麼對 a 加 1,就可以通路下一位:*(a+1) 就等于 a[1]。
通路一維數組首位址:a = &a[0];
通路一維數組的元素:a[i] = *(a+i);
輸出一維數組:puts(a); //a為字元串首位址
二維數組通路方式
假設有 a[2][2] 這樣一個二維數組,可以這麼了解它:a 由 a[0],a[1],a[2] 構成,而 a[0] 又由 a[0][0],a[0][1],a[0][2] 構成,a[1] 由 a[1][0],a[1][1],a[1][2] 構成,a[2] 由 a[2][0],a[2][1],a[2][2] 構成。
1. a 由 a[0],a[1],a[2] 構成,而 a[0] 又由 a[0][1],a[0][1],a[0][2] 構成;
兩個一維數組構成了一個二維數組。a 是一個二維數組,a[i] 是一個一維數組。既然 a[i] 是一個數組,那麼數組名就是這個數組的首位址。比如,a[0] 就等同于 &a[0][0]。
2. a 是一個數組名,它有三個元素:a[0],a[1],a[2];* a 等于 a[0],*(a + 1) 等于 a[1],*( a + 2 )等于 a[2];a[0], a[1], a[2] 又都是各個一維數組的首位址。比如 a[0] 就等同于 &a[0][0],就是說 *a[0] = a[0][0]。
再結合上面的 *a 等于 a[0],可以得出:**a 等于 a[0][0]。
以a[2][2]為例,則指針與數組的等價關系為:
3. 簡單記之,二維數組 a[i][j] 中的 a[i] 是一個一維數組名,也就是一個位址量。
通路二維數組的各個字元串首位址:a[i] = &a[i][0] = *(a+i)
通路二維數組的各個元素:a[i][j] = *(a[i] + j) = *(*(a+i)+j)
輸出二維數組中的一個字元串:puts(a[i]); //a[i]為字元串的首位址
通路字元串數組
通常對字元串的處理,傳入的的參數都是字元串的首位址,也就是字元串名。
比如:
char s[80]; // 定義一個長度為 80 的字元串 s
char t[80]; // 定義一個長度為 80 的字元串 t
gets (s); // 讀入一個字元串
puts (s); // 輸出一個字元串
strcpy (s, t); // 将字元串 t 拷貝到 字元串 s 中
其中的 s 都是該字元串的首位址。
那相對于二維數組而言,
char *s[] = "I", "love", "you"};
//輸出"love"
puts (s[1]); //字元串形式 - s[1]是一個位址量,代表"love",為"love"字串的首位址
puts (*(s+1)); //指針形式
參考部落格:
[1] 二維數組、指針數組、字元串二維數組 - 文之