概述
多维数组,实际上就是“数组的数组”。最常见的是二维数组,就像一个表格,拥有行和列。而三维数组则可以想象为多个这样的表格堆叠起来形成的一个立方体。依此类推,我们可以构建四维、五维甚至更高维度的数组。
多维数组主要用于表示具有多个属性的数据集合。在计算机图形学中,图像可以被视为二维像素矩阵。在科学计算中,物理场可能需要三维数组来表示。另外,棋盘类游戏中的棋盘通常是一个固定大小的网格,实际上也是一个多维数组。比如:国际象棋的棋盘是一个8 x 8的网格,可以用二维静态数组来表示。
声明与初始化
我们以二维数组为例,来说明如何进行声明与初始化。声明一个多维数组,首先需要明确指定数组的类型和每个维度的尺寸。声明格式通常如下:
type arrayName[size1][size2];
其中,type代表数组中元素的数据类型(比如:int、float等),而size1和size2则是在编译期可以确定的一个常量值或常量表达式,表示数组在一维和二维分别能够容纳的元素个数。比如:要声明一个3 x 4的二维数组,可以写为如下代码。
int paNumber[3][4];
其中,paNumber是一个包含3个元素的数组,每个元素本身又是一个包含4个整数的数组。
在声明二维数组的同时,还可以对二维数组进行初始化。初始化时,可以按照维度直接给出所有元素的值,形式如下。值得注意的是,如果省略某些值,默认它们会被设置为0。
int paNumber[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}
};
访问二维数组中的某个元素,可以通过两个连续的下标运算符[]实现,其语法格式如下:
arrayName[index1][index2];
其中,index1和index2是从0开始计数的位置索引,index1不能大于size1,index2不能大于size2。比如:有一个名为paNumber的整型数组,想要获取第二行第三列元素的值,可以写作paNumber[1][2]。
动态分配
有时候,我们需要根据程序运行时的变量值动态创建多维数组,而不是在编译时就确定其大小。此时,可以使用指针和new来实现。
在下面的示例代码中,这段代码首先创建了一个指向指针数组的指针ppMatrix(即二维数组),然后为每一行分配了足够的内存空间来存储列元素。
int nRows = 3;
int nCols = 4;
// 创建行指针数组
int** ppMatrix = new int*[nRows];
for(int i = 0; i < nRows; ++i)
{// 为每一行分配空间ppMatrix[i] = new int[nCols];
}
需要注意的是,动态分配内存后,我们必须释放这些资源,以防止内存泄漏。
for(int i = 0; i < nRows; ++i)
{// 释放每一行的内存delete[] ppMatrix[i];ppMatrix[i] = NULL;
}// 最后释放行指针数组的内存
delete[] ppMatrix;
ppMatrix = NULL;