C++多维数组 #

一、二维数组概述 #

二维数组可以看作是"数组的数组",常用于表示矩阵、表格等数据结构。

1.1 声明语法 #

cpp
// 语法:type name[rows][cols];
int matrix[3][4];  // 3行4列的二维数组

1.2 内存布局 #

二维数组在内存中按行连续存储:

text
matrix[0][0] matrix[0][1] matrix[0][2] matrix[0][3]
matrix[1][0] matrix[1][1] matrix[1][2] matrix[1][3]
matrix[2][0] matrix[2][1] matrix[2][2] matrix[2][3]

二、二维数组初始化 #

2.1 完全初始化 #

cpp
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

2.2 部分初始化 #

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

2.3 省略内层花括号 #

cpp
int matrix[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

2.4 省略行数 #

cpp
int matrix[][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};  // 编译器推断为3行

2.5 零初始化 #

cpp
int matrix[3][4] = {};  // 所有元素初始化为0

三、二维数组访问 #

3.1 下标访问 #

cpp
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 读取元素
std::cout << matrix[0][0] << std::endl;  // 1
std::cout << matrix[1][2] << std::endl;  // 7

// 修改元素
matrix[0][0] = 100;
matrix[2][3] = 200;

3.2 遍历二维数组 #

cpp
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 使用嵌套for循环
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        std::cout << matrix[i][j] << " ";
    }
    std::cout << std::endl;
}

// 使用范围for(C++11)
for (auto& row : matrix) {
    for (int x : row) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
}

四、二维数组操作 #

4.1 矩阵加法 #

cpp
const int ROWS = 3;
const int COLS = 4;

int a[ROWS][COLS] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int b[ROWS][COLS] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}};
int c[ROWS][COLS];

for (int i = 0; i < ROWS; i++) {
    for (int j = 0; j < COLS; j++) {
        c[i][j] = a[i][j] + b[i][j];
    }
}

4.2 矩阵乘法 #

cpp
const int M = 2, N = 3, P = 4;

int a[M][N] = {{1, 2, 3}, {4, 5, 6}};
int b[N][P] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int c[M][P] = {};

for (int i = 0; i < M; i++) {
    for (int j = 0; j < P; j++) {
        for (int k = 0; k < N; k++) {
            c[i][j] += a[i][k] * b[k][j];
        }
    }
}

4.3 矩阵转置 #

cpp
const int ROWS = 3, COLS = 4;

int matrix[ROWS][COLS] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int transposed[COLS][ROWS];

for (int i = 0; i < ROWS; i++) {
    for (int j = 0; j < COLS; j++) {
        transposed[j][i] = matrix[i][j];
    }
}

4.4 查找元素 #

cpp
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int target = 7;
bool found = false;
int foundRow = -1, foundCol = -1;

for (int i = 0; i < 3 && !found; i++) {
    for (int j = 0; j < 4 && !found; j++) {
        if (matrix[i][j] == target) {
            found = true;
            foundRow = i;
            foundCol = j;
        }
    }
}

if (found) {
    std::cout << "找到元素,位置: (" << foundRow << ", " << foundCol << ")" << std::endl;
}

五、二维数组与函数 #

5.1 传递给函数 #

cpp
// 必须指定列数
void printMatrix(int matrix[][4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    printMatrix(matrix, 3);
    return 0;
}

5.2 使用模板 #

cpp
template<size_t Rows, size_t Cols>
void printMatrix(int (&matrix)[Rows][Cols]) {
    for (size_t i = 0; i < Rows; i++) {
        for (size_t j = 0; j < Cols; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    printMatrix(matrix);
    return 0;
}

5.3 使用指针 #

cpp
void printMatrix(int* matrix, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            std::cout << matrix[i * cols + j] << " ";
        }
        std::cout << std::endl;
    }
}

int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    printMatrix(&matrix[0][0], 3, 4);
    return 0;
}

六、三维数组 #

6.1 声明与初始化 #

cpp
// 三维数组:x层,y行,z列
int cube[2][3][4] = {
    {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    },
    {
        {13, 14, 15, 16},
        {17, 18, 19, 20},
        {21, 22, 23, 24}
    }
};

6.2 访问元素 #

cpp
std::cout << cube[0][1][2] << std::endl;  // 7

// 遍历三维数组
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 4; k++) {
            std::cout << cube[i][j][k] << " ";
        }
        std::cout << std::endl;
    }
    std::cout << "---" << std::endl;
}

七、使用vector代替多维数组 #

7.1 二维vector #

cpp
#include <vector>

// 创建3行4列的二维vector
std::vector<std::vector<int>> matrix(3, std::vector<int>(4, 0));

// 初始化
std::vector<std::vector<int>> matrix2 = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 访问
matrix[0][0] = 1;

// 遍历
for (const auto& row : matrix) {
    for (int x : row) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
}

7.2 动态调整大小 #

cpp
std::vector<std::vector<int>> matrix;

// 设置大小
matrix.resize(3);  // 3行
for (auto& row : matrix) {
    row.resize(4);  // 每行4列
}

// 或一次性设置
matrix.resize(3, std::vector<int>(4));

八、最佳实践 #

8.1 使用常量定义大小 #

cpp
const int ROWS = 3;
const int COLS = 4;

int matrix[ROWS][COLS];

8.2 封装为类 #

cpp
class Matrix {
private:
    std::vector<std::vector<int>> data;
    
public:
    Matrix(int rows, int cols) : data(rows, std::vector<int>(cols, 0)) {}
    
    int& at(int row, int col) {
        return data[row][col];
    }
    
    int rows() const { return data.size(); }
    int cols() const { return data[0].size(); }
};

8.3 使用std::array #

cpp
#include <array>

std::array<std::array<int, 4>, 3> matrix = {{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
}};

九、总结 #

二维数组要点 #

操作 语法
声明 type name[rows][cols]
初始化 {{...}, {...}}
访问 matrix[i][j]
遍历 嵌套循环

选择建议 #

场景 推荐方案
固定大小 std::array
动态大小 std::vector
简单场景 原生数组

下一步,让我们学习字符数组与字符串!

最后更新:2026-03-26