C 語言中的多維陣列(multidimensional array)其實就是元素為陣列的陣列。n 維陣列的元素是 n-1 維陣列。例如,二維陣列的每個元素都是一維陣列,一維陣列的元素當然就不是陣列了。
多維陣列宣告時,每個維度用一對方括號來表示:
char screen[10][40][80]; // 一個三維陣列
陣列 screen 包含 10 個元素,從 screen[0] 到 screen[9]。每個元素又是一個二維陣列,它有 40 個元素,這 40 個元素均是一維陣列,然後每個一維陣列內都有 80 個字元。整體來說,screen 陣列有 32000(10×40×80)個 char 型別元素。
想要獲取該三維陣列 screen 內的某個 char 元素,必須指定 3 個索引值。例如,下面的語句把字元Z寫入該陣列的最後一個元素位置:
screen[9][39][79] = 'Z';
二維陣列(矩陣)
二維陣列常常被稱為矩陣(matrix)。它應用頻繁,因此我們來更詳細地討論下矩陣。把矩陣想成列和行的排列方式,更有助於理解它。下面定義的矩陣 mat 有三行和五列:
float mat[3][5];
這三個元素 mat[0]、mat[1] 和 mat[2] 是矩陣 mat 的三行。每行都是由五個 float 元素所組成的陣列。因此,該矩陣包含 3×5=15 個 float 元素,如下表所示:
|
[0] |
[1] |
[2] |
[3] |
[4] |
mat[0] |
0.0 |
0.1 |
0.2 |
0.3 |
0.4 |
mat[1] |
1.0 |
1.1 |
1.2 |
1.3 |
1.4 |
mat[2] |
2.0 |
2.1 |
2.2 |
2.3 |
2.4 |
上圖中所指定的值可以利用巢狀迴圈語句賦值得到的。第一個索引值指定行,第二個索引值定位到該行中的某列:
for ( int row = 0; row < 3; ++row )
for ( int col = 0; col < 5; ++col )
mat[row][col] = row + (float)col/10;
在記憶體中,這三行被連續儲存在一起,因為它們都是 mat 陣列的元素。這樣的話,該陣列中的 float 值以遞增的順序儲存在一起。
宣告多維陣列
在陣列宣告中,如果執行定義操作的話,陣列型別可以是不完整的。也就是說,
可以宣告陣列,卻不指定其長度。
這種宣告所參照的陣列,必須在程式其他地方指定它的長度。然而,必須宣告一個陣列元素的完整型別。
對於一個多維陣列的宣告而言,只有第一個維度可以不指定長度,所有其他維度都必須指定長度。例如,在宣告二維陣列時,必須要指定列的數量。
如果前面例子的陣列 mat 有外部連結(例如,它的定義在所有函數外部),那麼其他原始碼檔案只要做如下宣告,就可以使用 mat:
extern float mat[ ][5]; // 外部宣告
初始化多維陣列
可以利用初始化列表來初始化多維陣列,還有一些需要特別注意的地方:
不必為每個維度都寫一對大括號,可以使用多維元素指示符。
為展示各種可能性,我們假定一個陣列定義和初始化如下:
int a3d[2][2][3] = { { { 1, 0, 0 }, { 4, 0, 0 } },
{ { 7, 8, 0 }, { 0, 0, 0 } } };
這個初始化列表包含了三個層次的列表大括號,並且用下面的值初始化二維陣列 a3d[0] 和 a3d[l] 的元素:
|
[0] |
[1] |
[2] |
a3d[0][0] |
1 |
0 |
0 |
a3d[0][1] |
4 |
0 |
0 |
|
[0] |
[1] |
[2] |
a3d[1][0] |
7 |
8 |
0 |
a3d[1][1] |
0 |
0 |
0 |
因為所有只要沒與初始化器的元素,就會被初始化為預設的 0,所以下面的定義具有一樣的效果:
int a3d[ ][2][3] = { { { 1 }, { 4 } }, { { 7, 8 } } };
該初始化列表也顯示出三個層次的大括號。不需要指定第一個維度為 2,因為最外面的初始化列表包含兩個初始化器。
也可以省略某些大括號。如果某對大括號包含了比對應陣列維度中元素數量還多的初始化器,那麼多出來的初始化器會被關聯到儲存序列中的下一個陣列元素中。因此,下面這兩個定義是等價的:
int a3d[2][2][3] = { { 1, 0, 0, 4 }, { 7, 8 } };
int a3d[2][2][3] = { 1, 0, 0, 4, 0, 0, 7, 8 };
最後,可以利用元素指示符達到相同的初始化目的,如下所示:
int a3d[2][2][3] = { 1, [0][1][0]=4, [1][0][0]=7, 8 };
上述定義等同於:
int a3d[2][2][3] = { {1}, [0][1]={4}, [1][0]={7, 8} };
如果只有一小部分的元素需要被初始化為 0 以外的值,那麼使用元素指示符是一個不錯的做法。