C語言多維陣列,以及多維陣列中的二維陣列

2020-07-16 10:04:27
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 以外的值,那麼使用元素指示符是一個不錯的做法。