學習C++ -> 二維數組
一、二維數組的介紹
當數組元素具有兩個下標時, 該數組稱為二維數組。 二維誰可以看做具有行和列的平面數據結構。
二、二維數組的定義
定義二維數組的形式:
數據類型 數組名[常量表達式1][常量表達式2] ;
數據類型是數組全體元素的數據類型, 數組名用合法的標識符表示, 兩個整型常量表達式可以理解為分別代表行數和列數, 與一維數組相同, 數組元素的下標一律從 0 開始。例如:
int a[3][5] ;
該語句表示:
①. 定義了一個二維數組a, 其數據類型為int型 ;
②. a數組有3行5列, 共能容納 3*5 = 15 個 int 型的數據 ;
③. a數組的行下標為 0, 1, 2, 列下標為 0, 1, 2, 3, 4 , 所有元素的位置可表示為:
a[0][0], a[0][1], a[0][2], a[0][3], a[0][4] a[1][0], a[1][1], a[1][2], a[1][3], a[1][4] a[2][0], a[2][1], a[2][2], a[2][3], a[2][4]
④. 程序運行時將為a數組在內存中開辟 3*5* 4(字節) = 60個字節連續的存儲單元 ;
三、二維數組的使用
同一維數組一樣, 引用二維數組的元素, 也是引用他的數組元素, 數組元素的形式為:
數組名[行下標][列下標] ;
例如, 若定義 int a[3][5], i = 2, j = 4 ; 則下列引用都是合法的:
a[0][0]、a[2][4]、a[i][j]、a[i-1][j]、a[1][j-1]
使用舉例:
1>. 輸入一個 2x3 大小的二維數組, 輸入完畢后再全部輸出
#include<iostream> using namespace std ; int main() { int a[2][3] ; int i, j ; //循環控制 for( i = 0; i < 2; i++ ) //輸入數據 for( j = 0; j < 3; j++ ) cin >> a[i][j] ; for( i = 0; i < 2; i++ ) //將數組中的元素全部輸出 for( j = 0; j < 3; j++ ) cout << a[i][j] <<" " ; return 0 ; }
四、二維數組的初始化
二維數組初始化的形式為:
數據類型 數組名[常量表達式1][常量表達式2] = { 初始化數據 } ;
在 { } 這給出各數據元素的初始值, 各初值之間用逗號隔開。 把 { } 中的初值依次賦給各數組元素。
有如下幾種初始化方式:
1>. 分行進行初始化
int a[2][3] = { {1, 2, 3}, {4, 5, 6} } ;
在 { } 內部再用 {} 進行分開, 第一組 {} 中的初始值 1, 2, 3 是下標為 0 行的3個元素的初值。 第二對 {} 中的值 4, 5, 6 是下標為 1 行的 3 個元素的初值, 相當於執行如下語句:
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;
注意: 初始化的數據個數不能超過數組元素所能容納的個數, 否則會出錯。
2>. 不分行初始化
int a[2][3] = { 1, 2, 3, 4, 5, 6 } ;
把 { } 中的數據依次賦值給 a 數組各元素(按行賦值), 即:
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;
3>. 為部分數據元素初始化
int a[2][3] = { {1, 2}, {4} } ;
第一行只有2個初值, 按順序分別賦值給 a[0][0] 和 a[0][1], 第二行的初值 4 賦給 a[1][0]。
4>. 省略第一維的定義, 但不能省略第二維的定義
int a[][3] = { 1, 2, 3, 4, 5, 6 } ;
系統能夠根據初始化元素的個數和第二維的長度來確定第一維的長度。
一般, 省略第一維定義時, 第一維的大小按如下規則確定:
初值個數能被第二維整除, 所得的商就是第一維的大小 ;
若不能整除, 第一維的大小為商再加 1。例如:
int a[][3] = { 1, 2, 3, 4, 5 } ;
等價於:
int a[2][3] = { 1, 2, 3, 4, 5 } ;
若分行初始化, 也可以省略第一維的定義, 如:
int a[][3] = { {1, 2}, {4} } ;
其中 { } 中又包括 兩個 {} , 這代表數組 a 的第一維大小為 2。
五、二維數組應用舉例
如圖, 將 圖a 中所示的數組轉成如 圖b 所示的情況(也成矩陣轉置):
解決代碼:
1 #include<iostream> 2 3 using namespace std ; 4 5 int main() 6 { 7 int arr[4][4] = { {1, 2, 3, 4}, 8 {5, 6, 7, 8}, 9 {9, 10, 11, 12}, 10 {13, 14, 15, 16} } ; 11 int m, n ; //循環控制 12 int temp ; //臨時變量, 用於交換數據 13 14 //開始進行矩陣轉置 15 for( m = 0; m < 4; m++ ) 16 for( n = m+1; n < 4; n++ ) 17 { 18 temp = arr[m][n] ; 19 arr[m][n] = arr[n][m] ; 20 arr[n][m] = temp ; 21 } 22 23 //輸出轉置后的狀態 24 for( m = 0; m < 4; m++ ) 25 { 26 for( n = 0 ; n < 4; n++ ) 27 { 28 cout << arr[m][n] << " " ; 29 } 30 cout<<endl; //每輸出一行后進行換行 31 } 32 33 return 0 ; 34 }
六、二維字符數組
二維字符數組常用來存放字符串, 二維字符數組每一行可以看做一維字符數組, 即二維字符數組的每一行可以存放一個字符串。
1>. 二維字符數組的定義:
二維字符數組的定義與一般二維數組的定義方式相同, 只是數據類型為 char。例如:
char a[3][10] ;
二維字符數組 a 有2行5列, 每一行可以存放長度小於或等於4的字符串(不要忘了要給字符串結束標識符留一個位置)。
2>. 二維數組的初始化:
和一維字符數組一樣, 二維字符數組也可以在定義時初始化, 如:
char a[3][10] = { "Hello", "world", "C++" } ; char a[][10] = { "Hello", "world", "C++" } ; //第二維同樣不可省略
將二維字符數組圖示展開如下(二維字符數組a, 3行10列):
H | e | l | l | o | \0 | ||||
w | o | r | l | d | \0 | ||||
C | + | + | \0 |
3>. 二維字符數組的使用
由於在二維字符數組每個字符串單獨占一行, 所以可以用 a[n] 引用該二維數組字符中第 n 行的字符串, 也可以用 a[i][j] 引用某行某列中的單獨一個字符串。
示例: 輸入二維字符數組中每行中的字符串
1 #include<iostream> 2 3 using namespace std ; 4 5 int main() 6 { 7 char a[3][10] = { "Hello", "world", "C++" } ; 8 int n ; 9 for( n = 0; n < 3; n++ ) //按行輸出 10 cout << a[n] << endl ; 11 12 return 0 ; 13 }
C++語言對數組的維數沒有限制, 因此你還可以根據一維和2維的規律使用 3 維數組或更高維的數組, 但是在高維數組上的處理比較難理解, 不熟練的情況下容易出錯, 因此對於 3 維以上的數組請酌情使用。
--------------------
wid, 2012.12.11
上一篇: 學習C++ -> 字符串