1. 程式人生 > >15. C語言 -- 二維陣列

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

歡迎大家關注我的知乎號(左側)和經常投稿的微信公眾號(右側)

在這裡插入圖片描述