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