C++二维数组的声明和初始化(附带实例)
一维数组描述的是一个线性序列,二维数组描述的是一个矩阵。二维数组包含行、列两个维度,如 a[m][n] 表示一个包含 m 行 n 列元素的数组。
二维数组可以看作是特殊的一维数组,其各元素仍然是一个数组。例如,二维数组 a[3][4] 包含 3 行 4 列,其 a[0] 行、a[1] 行、a[2] 行都是一个一维数组,分别有 4 个元素,共 12 个元素,如下图所示:

图 1 二维数组
例如:
使用二维数组的说明如下:
例如,下面为不合法的定义形式:
常量表达式表示数组的长度,不能是变量,因为数组的大小不能动态地定义。例如:
引用二维数组元素时,需要注意:
例如,有二维数组 a[3][4],则下述引用方式:
聚合赋值具体是怎么实现的呢?二维数组元素在内存中是按行存放的,因此上述聚合赋值的顺序为:先给第一行元素(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])赋值。
因此,上述第二行语句等同于:

图 2 数组元素的位置以及对应数值
聚合方式赋值时,需要注意:
1) 除了整体聚合赋值,还可以按行聚合赋值,例如:
2) 如果只给部分数组元素赋值,则未被赋值的元素默认为被赋值 0。例如:
数组元素是左值,可以出现在表达式中,也可以对数组元素进行计算,例如:
【实例】将二维数组行列对换。
二维数组可以看作是特殊的一维数组,其各元素仍然是一个数组。例如,二维数组 a[3][4] 包含 3 行 4 列,其 a[0] 行、a[1] 行、a[2] 行都是一个一维数组,分别有 4 个元素,共 12 个元素,如下图所示:

图 1 二维数组
C++二维数组的声明
二维数组的声明形式如下:数据类型 数组名[常量表达式1][常量表达式2]其中,常量表达式 1 代表行数,常量表达式 2 代表列数。
例如:
int a[3][4]; // 声明一个 3 行 4 列的整型数组 float myArray[4][5]; // 声明一个 4 行 5 列的浮点型数组
使用二维数组的说明如下:
- 数组名的命名必须符合标识符命名规则;
- 二维数组有行、列两个下标,因此声明时需有两个方括号。
例如,下面为不合法的定义形式:
int a[3,4]; int a[3:4];
常量表达式表示数组的长度,不能是变量,因为数组的大小不能动态地定义。例如:
int a[i][j];数组中每一维的长度都必须是正整数,其乘积决定了整个数组的长度。例如,数组 a[3][4] 中包含 3×4=12 个元素。
C++二维数组元素的引用
二维数组元素的引用形式为:数组名[下标][下标]
引用二维数组元素时,需要注意:
- 行下标、列下标的索引都从 0 开始。一个 m 行 n 列的二维数组 a[m][n],其行下标的取值范围为 0~m−1,列下标的取值范围为 0~n−1,最大下标元素是 a[m−1][n−1]。
- 二维数组在内存中是按行存放各元素的。例如,数组 a[3][4] 在内存中先存放 a[0] 行,包含 a[0][0]、…、a[0][3];接着存放 a[1] 行,包含 a[1][0]、…、a[1][3];最后存放 a[2] 行,包含 a[2][0]、…、a[2][3]。通过行下标和列下标,可快速定位其中任意一个元素。
例如,有二维数组 a[3][4],则下述引用方式:
a[2,3] // 不合法引用 a[2-1][2*2-1] // 合法引用 a[2-1,2*2-1] // 不合法引用,少一个方括号 a[4][4] // 不合法引用,行、列下标均越界
C++二维数组的初始化
二维数组元素的初始化方式和一维数组相同,也分为数组元素逐一赋值和使用聚合方式赋值两种方式。例如:myArray[0][1] = 12; // 数组元素逐一赋值 int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 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])赋值。
因此,上述第二行语句等同于:
a[0][0]=1; a[0][1]=2; a[0][2]=3; a[0][3]=4; a[1][0]=5; a[1][1]=6; a[1][2]=7; a[1][3]=8; a[2][0]=9; a[2][1]=10; a[2][2]=11; a[2][3]=12;上述聚合赋值方式中,数组元素位置及对应数值如下图所示。

图 2 数组元素的位置以及对应数值
聚合方式赋值时,需要注意:
1) 除了整体聚合赋值,还可以按行聚合赋值,例如:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2) 如果只给部分数组元素赋值,则未被赋值的元素默认为被赋值 0。例如:
int a[3][4] = {1,2,3,4}; //相当于只给第一行赋值,其余数组元素均为 0
数组元素是左值,可以出现在表达式中,也可以对数组元素进行计算,例如:
b[1][2]=a[2][3]/2;
【实例】将二维数组行列对换。
#include <iostream> #include <iomanip> using namespace std; int fun(int array[3][3]) // 定义函数 fun(),作用是将二维数组行、列元素互换 { int i, j, t; for(i = 0; i < 3; i++) for(j = 0; j < i; j++) { t = array[i][j]; array[i][j] = array[j][i]; array[j][i] = t; } return 0; } int main() { int i, j; int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 定义数组 array 并赋初值 cout << "Converted Front" << endl; for(i = 0; i < 3; i++) // 双重 for 循环,输出转置前的数组 array { for(j = 0; j < 3; j++) cout << setw(7) << array[i][j]; cout << endl; } fun(array); // 调用函数 fun(),将二维数组行、列元素对换 cout << "Converted result" << endl; for(i = 0; i < 3; i++) // 双重 for 循环,输出转之后的数组 array { for(j = 0; j < 3; j++) cout << setw(7) << array[i][j]; cout << endl; } }程序运行结果为:
Converted Front 1 2 3 4 5 6 7 8 9 Converted result 1 4 7 2 5 8 3 6 9程序首先输出二维数组 array 中的元素,然后调用自定义函数 fun() 将数组中的行元素转换为列元素,最后输出转换后的结果。