首页 > 编程笔记 > C++笔记 阅读:5

C++二维数组的声明和初始化(附带实例)

一维数组描述的是一个线性序列,二维数组描述的是一个矩阵。二维数组包含行、列两个维度,如 a[m][n] 表示一个包含 m 行 n 列元素的数组。

二维数组可以看作是特殊的一维数组,其各元素仍然是一个数组。例如,二维数组 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++二维数组元素的引用

二维数组元素的引用形式为:

数组名[下标][下标]


引用二维数组元素时,需要注意:
例如,有二维数组 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() 将数组中的行元素转换为列元素,最后输出转换后的结果。

相关文章