天天看點

一維數組與二維數組的通路方式

一維數組通路方式

一維數組中 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]  二維數組、指針數組、字元串二維數組   -  文之

繼續閱讀