在C++中,二维数组是一个非常重要的数据结构,它允许你以矩阵的形式存储和操作数据。与一维数组不同,二维数组可以看作是数组的数组,即每个元素本身也是一个数组。这里,我们将深入探讨C++中二维数组的一些进阶用法,包括初始化、遍历、以及通过函数操作二维数组的方法。
一、二维数组的初始化
二维数组可以在声明时直接初始化,也可以通过函数来初始化。
直接初始化
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
通过函数初始化
可以通过函数返回指向二维数组首元素的指针(注意,返回局部数组的地址是未定义行为,通常我们会使用动态内存分配或引用外部数组)。
#include <iostream>
int** createArray(int rows, int cols) {
int** arr = new int*[rows];
for (int i = 0; i < rows; ++i) {
arr[i] = new int[cols];
}
// 初始化示例,这里仅设置为0
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
arr[i][j] = 0;
}
}
return arr;
}
void freeArray(int** arr, int rows) {
for (int i = 0; i < rows; ++i) {
delete[] arr[i];
}
delete[] arr;
}
二、遍历二维数组
遍历二维数组通常使用嵌套循环。
#include <iostream>
void printArray(int arr[][4], int rows) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 4; ++j) {
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}
}
三 、动态二维数组
除了使用静态二维数组(其大小在编译时确定),C++还允许你使用动态二维数组,即其大小在运行时确定。这通常通过指针的指针来实现,或者使用std::vector<std::vector>等容器类。
动态二维数组示例(使用指针的指针)
#include <iostream>
int** createDynamic2DArray(int rows, int cols) {
int** arr = new int*[rows];
for (int i = 0; i < rows; ++i) {
arr[i] = new int[cols];
}
// 初始化(可选)
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
arr[i][j] = i * cols + j; // 示例初始化
}
}
return arr;
}
void freeDynamic2DArray(int** arr, int rows) {
for (int i = 0; i < rows; ++i) {
delete[] arr[i];
}
delete[] arr;
}
// 使用示例...
四、例题与解答
例题
编写一个程序,使用二维数组来存储一个3x4的矩阵,并通过函数计算并打印出该矩阵的转置矩阵。
解答
#include <iostream>
void printTranspose(int arr[][4], int rows) {
for (int j = 0; j < 4; ++j) { // 注意这里j和i的位置交换了
for (int i = 0; i < rows; ++i) {
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}
}
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
std::cout << "Original Matrix:" << std::endl;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << "Transpose Matrix:" << std::endl;
printTranspose(arr, 3);
return 0;
}
在这个例子中,我们首先定义了一个3x4的矩阵arr,并初始化了它的值。然后,我们定义了一个printTranspose函数来打印矩阵的转置。在main函数中,我们首先打印了原始矩阵,然后调用了printTranspose函数来打印转置矩阵。注意,在打印转置矩阵时,我们交换了循环的迭代变量i和j的顺序。