C++ 2维数组进阶知识

在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的顺序。

7 个赞

部分代码从网上引用。点个赞吧!

2 个赞

6

1 个赞

6啥6,引用代码不行吗?

1 个赞

你自己难道不是AI写的。



image