本節學習二維陣列。二維陣列與一維陣列相似,但是用法上要比一維陣列複雜一點。後面的程式設計中,二維陣列用得很少,因為二維陣列的本質就是一維陣列,只不過形式上是二維的。能用二維陣列解決的問題用一維陣列也能解決。但是在某些情況下,比如矩陣,對於程式設計師來說使用二維陣列會更形象直觀,但對於計算機而言與一維陣列是一樣的。
二維陣列的定義
二維陣列定義的一般形式為:
型別說明符 陣列名[ 常數表示式][ 常數表示式];
比如:
int a[3][4];
表示定義了一個 3×4,即 3 行 4 列總共有 12 個元素的陣列 a。這 12 個元素的名字依次是:a[0][0]、a[0][1]、a[0][2]、a[0][3];a[1][0]、a[1][1]、a[1][2]、a[1][3];a[2][0]、a[2][1]、a[2][2]、a[2][3]。
與一維陣列一樣,行序號和列序號的下標都是從 0 開始的。元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。陣列 int a[m][n] 最大範圍處的元素是 a[m–1][n–1]。所以在參照陣列元素時應該注意,下標值應在定義的陣列大小的範圍內。
此外,與一維陣列一樣,定義陣列時用到的“陣列名[常數表示式][常數表示式]”和參照陣列元素時用到的“陣列名[下標][下標]”是有區別的。前者是定義一個陣列,以及該陣列的維數和各維的大小。而後者僅僅是元素的下標,像坐標一樣,對應一個具體的元素。
C 語言對二維陣列採用這樣的定義方式,使得二維陣列可被看作一種特殊的一維陣列,即它的元素為一維陣列。比如“int a[3][4];”可以看作有三個元素,每個元素都為一個長度為 4 的一維陣列。而且 a[0]、a[2]、a[3] 分別是這三個一維陣列的陣列名。下面來驗證一下看看是不是這麼回事兒:
# include <stdio.h>
int main(void)
{
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
printf("%dn", sizeof(a[0]));
return 0;
}
輸出結果是:
16
可見 a[0] 確實是第一行一維陣列的陣列名,其他同理。
在 C 語言中,二維陣列中元素排列的順序是按行存放的,即在記憶體中先順序存放第一行的元素,再存放第二行的元素,這樣依次存放。
二維陣列的初始化
可以用下面的方法對二維陣列進行初始化。
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};
效果與第 1 種是一樣的。但第1種方法更好,一行對一行,界限清楚。第 2 種方法如果資料多,寫成一大片,容易遺漏,也不易檢查。
3) 也可以只對部分元素賦初值。比如:
int a[3][4] = {{1, 2}, {5}, {9}};
它的作用是對第一行的前兩個元素賦值、第二行和第三行的第一個元素賦值。其餘元素自動為 0。初始化後陣列各元素為: