15. C語言 -- 二維陣列
本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。
也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。・∀・)ノ゙
1. 二維陣列的定義
定義二維陣列的方法跟一位陣列相似,使用方括號指定每個維度的元素個數:
型別 陣列名[常量表達式][常量表達式]
int a[6][6]; // 6*6,6行6列
char b[4][5]; // 4*5,4行5列
double c[6][3]; // 6*3,6行3列
其實可以很形象的將二維陣列想象成一個平面,如下所示分別對應著 66,45 和 6*3 大小的二維陣列。
但是這只是一種想象,因為實際上二維陣列在記憶體中是以線性的方法進行儲存的,如下圖為一個 int b[4][5];
大小的陣列在記憶體中儲存示意圖
如上圖所示,其中的 b[0] 表示 int b[4][5];
中的第一行中的元素,同理剩下的表示第二行,第三行和第四行中的元素。之後第二行可以看到 b[0] 中具體儲存的是第一行中的四個元素。所以陣列在記憶體中是按照這種規律進行儲存的。
2. 二維陣列的初始化
二維陣列主要提供了以下幾種初始化的方式
(1) 由於二維陣列在記憶體中是線性存放的,因此可以將所有的資料寫在一個花括號內,即
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
(2) 為了更直觀地表示元素的分佈,可以用大括號將每一行的元素括起來,即
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
// 或者
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
對於上面程式碼中的兩種方式,我們更推薦第二種方式。因為第二種方式更加直接,雖然佔用空間變大了,但是也更容易被理解。
(3) 二維陣列也可以僅對部分元素賦初值
int a[3][4] = {{1}, {5}, {9}};
上面的這段程式碼將對陣列中第每一行的第一個元素進行賦值,其餘的部分將自動補零。
(4) 如果希望整個二維陣列初始化為0,那麼直接在大括號裡寫一個0即可:
int a[3][4] = {0};
(5) C99同樣增加了一種新特性:指定初始化的元素。這樣就可以只對陣列中的某些指定元素進行初始化賦值,而未被賦值的元素自動初始化為0:
int a[3][4] = {[0][0] = 1, [1][1] = 2, [2][2] = 3};
(6) 二維陣列的初始化也能偷懶,讓編譯器根據元素的數量計算陣列的長度。但只有第1維的元素個數可以不寫,其他維度必須寫上:
int a[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
3. 二維陣列的訪問
二維陣列的訪問的具體方式如下
// 陣列名[下標]
a[0][0]; // 訪問a陣列中第1行第1列的元素
b[1][3]; // 訪問b陣列中第2行第4列的元素
c[3][3]; // 訪問c陣列中第4行第4列的元素
跟訪問一位陣列相似,同樣是使用下標訪問陣列中的元素。同樣需要注意下標的取值範圍,以防止陣列的越界訪問。比如 int a[3][4],其“行下標”的取值範圍是 0~2,“列下標”的取值範圍是 0~3,超出任何一個下標的訪問都會造成越界。
參考
[1] “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】P20
歡迎大家關注我的知乎號(左側)和經常投稿的微信公眾號(右側)