二维数组本质上是一个数组的数组,可以理解为一个表格或矩阵,有行和列两个维度。
二维数组的基本概念
// 二维数组的逻辑结构
int matrix[3][4]; // 3行4列的矩阵
// 可视化表示:
// 列: 0 1 2 3
// 行0 [ ][ ][ ][ ]
// 行1 [ ][ ][ ][ ]
// 行2 [ ][ ][ ][ ]
二维数组的声明和初始化
#include <bits/stdc++.h>
using namespace std;
int main() {
// 1. 声明时指定大小
int arr1[2][3]; // 2行3列,未初始化,包含随机值
int arr2[2][3]={}; // 初始化全为0
// 2. 声明并初始化(嵌套花括号)
int arr3[2][3] = {
{1, 2, 3}, // 初始化arr2[0]数组
{4, 5, 6} // 初始化arr2[1]数组
};
// 3. 省略内层花括号(按行优先顺序填充)
int arr4[2][3] = {1, 2, 3, 4, 5, 6}; // 等价于上面
int arr5[2][3] = {1, 2, 5, 6}; // 等价于{125}{600}
// 4. 部分初始化(未指定的元素自动为0)
int arr6[2][3] = {
{1, 2}, // 等价于 {1, 2, 0}
{4} // 等价于 {4, 0, 0}
};
// 5. 省略第一维大小(必须指定第二维)
int arr7[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}; // 自动推断为3行
return 0;
}
二维数组的访问和遍历
#include <bits/stdc++.h>
using namespace std;
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 1. 访问单个元素
cout << matrix[1][2] << endl; // 输出7
// 2. 修改元素
matrix[0][0] = 100;
// 3. 使用嵌套循环遍历
for (int i = 0; i < 3; i++) { // 遍历行
for (int j = 0; j < 4; j++) { // 遍历列
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}
常用输入输出模板
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m; // n代表行,m代表列,
int a[105][105]={}; // 初始化二维数组
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
// 遍历输出数组
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
扩展内容
- 矩阵转置
- 矩阵相加
- 螺旋遍历
- 二维一维数组互转
- 等
总结要点
- 存储方式:行优先连续存储
- 索引:从0开始,
arr[行][列] - 初始化:可使用嵌套花括号
- 传参:第二维大小必须指定
- 内存布局:理解地址计算有助于优化