跳转到内容

C++ 二维数组

来自代码酷
Admin留言 | 贡献2025年4月28日 (一) 21:29的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

C++二维数组[编辑 | 编辑源代码]

二维数组是C++中一种重要的数据结构,它允许开发者以表格形式(行和列)存储数据。与一维数组不同,二维数组可以更直观地表示矩阵、表格或棋盘等结构。

定义与声明[编辑 | 编辑源代码]

二维数组的声明语法如下:

数据类型 数组名[行数][列数];

例如,声明一个3行4列的整型数组:

int matrix[3][4];

内存布局[编辑 | 编辑源代码]

二维数组在内存中是按行连续存储的。例如,上述matrix[3][4]的内存布局如下:

graph LR A[matrix[0][0]] --> B[matrix[0][1]] --> C[matrix[0][2]] --> D[matrix[0][3]] D --> E[matrix[1][0]] --> F[matrix[1][1]] --> G[matrix[1][2]] --> H[matrix[1][3]] H --> I[matrix[2][0]] --> J[matrix[2][1]] --> K[matrix[2][2]] --> L[matrix[2][3]]

初始化方法[编辑 | 编辑源代码]

二维数组有多种初始化方式:

完全初始化[编辑 | 编辑源代码]

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

部分初始化[编辑 | 编辑源代码]

未指定的元素会自动初始化为0:

int matrix[2][3] = {
    {1},        // 第一行:1, 0, 0
    {4, 5}      // 第二行:4, 5, 0
};

省略第一维大小[编辑 | 编辑源代码]

编译器可以自动推断行数:

int matrix[][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

访问元素[编辑 | 编辑源代码]

通过双重索引访问元素,行和列索引都从0开始:

int value = matrix[1][2];  // 访问第二行第三列
matrix[0][1] = 10;        // 修改第一行第二列

实际案例[编辑 | 编辑源代码]

案例1:矩阵转置[编辑 | 编辑源代码]

将矩阵的行列互换:

#include <iostream>
using namespace std;

int main() {
    int original[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int transposed[3][2];

    // 转置操作
    for(int i = 0; i < 2; ++i) {
        for(int j = 0; j < 3; ++j) {
            transposed[j][i] = original[i][j];
        }
    }

    // 输出结果
    for(int i = 0; i < 3; ++i) {
        for(int j = 0; j < 2; ++j) {
            cout << transposed[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

输出:

1 4 
2 5 
3 6 

案例2:游戏地图[编辑 | 编辑源代码]

用二维数组表示简单的2D游戏地图:

#include <iostream>
using namespace std;

int main() {
    // 0=空地, 1=墙, 2=玩家, 3=宝藏
    int gameMap[5][5] = {
        {1, 1, 1, 1, 1},
        {1, 0, 0, 3, 1},
        {1, 0, 1, 0, 1},
        {1, 2, 0, 0, 1},
        {1, 1, 1, 1, 1}
    };

    // 渲染地图
    for(int i = 0; i < 5; ++i) {
        for(int j = 0; j < 5; ++j) {
            switch(gameMap[i][j]) {
                case 0: cout << " "; break;
                case 1: cout << "#"; break;
                case 2: cout << "P"; break;
                case 3: cout << "T"; break;
            }
        }
        cout << endl;
    }
    return 0;
}

输出:

#####
#  T#
# # #
#P  #
#####

高级主题[编辑 | 编辑源代码]

动态二维数组[编辑 | 编辑源代码]

对于需要在运行时确定大小的二维数组,可以使用指针数组:

int rows = 3, cols = 4;
int** dynamicMatrix = new int*[rows];
for(int i = 0; i < rows; ++i) {
    dynamicMatrix[i] = new int[cols];
}

// 使用后记得释放内存
for(int i = 0; i < rows; ++i) {
    delete[] dynamicMatrix[i];
}
delete[] dynamicMatrix;

多维数组的数学表示[编辑 | 编辑源代码]

二维数组可以表示数学中的矩阵。例如矩阵乘法:

给定两个矩阵解析失败 (语法错误): {\displaystyle A_{m×n}}解析失败 (语法错误): {\displaystyle B_{n×p}} ,其乘积解析失败 (语法错误): {\displaystyle C_{m×p}} 的元素计算为: cij=k=1naik×bkj

常见问题[编辑 | 编辑源代码]

Q: 二维数组和数组的数组有什么区别? A: 在C++中,二维数组本质上就是数组的数组。例如,int arr[3][4]是一个包含3个元素的数组,每个元素又是一个包含4个整数的数组。

Q: 如何获取二维数组的行数和列数? A: 对于静态数组:

int rows = sizeof(matrix) / sizeof(matrix[0]);      // 行数
int cols = sizeof(matrix[0]) / sizeof(matrix[0][0]); // 列数

性能考虑[编辑 | 编辑源代码]

1. 局部性原理:按行顺序访问数组可以利用缓存局部性,提高性能。 2. 对于大型数组,考虑使用一维数组模拟二维数组(array[row*cols + col]),有时性能更好。 3. 动态分配的二维数组可能不如连续存储的一维数组高效。

总结[编辑 | 编辑源代码]

二维数组是C++中表示表格数据的强大工具。掌握它的声明、初始化和访问方法对处理矩阵、图像、游戏地图等应用至关重要。对于高级应用,可以考虑使用标准库中的vector或专门的矩阵库来提高开发效率和性能。