C語言中文網 目錄

C語言多維數組,以及多維數組中的二維數組

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 以外的值,那么使用元素指示符是一個不錯的做法。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo