C++基础语法详解:二维数组的全面解析
创作时间:
作者:
@小白创作中心
C++基础语法详解:二维数组的全面解析
引用
CSDN
1.
https://m.blog.csdn.net/overload100/article/details/145948517
二维数组是C++中非常重要的数据结构之一,它在游戏开发、图像处理、数据存储等领域都有广泛的应用。本文将从直观理解、核心操作、进阶应用、内存本质、工程实践、应用场景等多个维度,全面介绍二维数组的使用方法和技巧。
一、二维数组的直观理解
1.1 楼房模型比喻
假设酒店的一层连续房间是一维数组,那么整栋酒店楼房就是二维数组:
- 第一下标表示楼层(垂直维度)
- 第二下标表示房间号(水平维度)
// 声明3层楼,每层5个房间的int型酒店
int hotel[3][5];
1.2 内存布局特性
二维数组在内存中采用行优先存储:
楼层0:[0][0][0][1][0][2][0][3][0][4] // 第0层5个房间
楼层1:[1][0][1][1][1][2][1][3][1][4] // 第1层5个房间
楼层2:[2][0][2][1][2][2][2][3][2][4] // 第2层5个房间
二、核心操作详解
2.1 声明与初始化
合法声明方式:
// 方式1:显式声明两个维度
int classroom[4][6]; // 4排6列座位
// 方式2:初始化推断第一维度
int chessBoard[][3] = {
{1,2,3},
{4,5,6}
}; // 自动推断为[2][3]
// 方式3:全零初始化
int matrix[5][5] = {0}; // 创建5x5零矩阵
非法声明示例:
int errorArr[][] = {{1,2}, {3,4}}; // 错误!必须指定列数
2.2 元素访问规范
// 正确访问示例
hotel[1][3] = 1001; // 第二层第四间房入住1001号
cout << hotel[0][2]; // 查看第一层第三间房
// 危险越界访问
cout << hotel[3][0]; // 楼层越界(只有0-2层)
cout << hotel[1][5]; // 房间号越界(每层0-4号)
三、进阶应用技巧
3.1 遍历二维数组
// 经典嵌套循环遍历
int scores[3][4] = {
{85, 90, 78, 92},
{76, 88, 95, 81},
{90, 82, 89, 93}
};
for(int floor=0; floor<3; ++floor) {
for(int room=0; room<4; ++room) {
cout << scores[floor][room] << "\t";
}
cout << endl;
}
3.2 矩阵转置实现
const int N = 3;
int matrix[N][N] = {{1,2,3}, {4,5,6}, {7,8,9}};
// 转置算法
for(int i=0; i<N; ++i) {
for(int j=i+1; j<N; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
四、内存本质揭秘
4.1 地址计算原理
二维数组元素arr[i][j]
的地址计算:
地址 = 首地址 + (i * 列数 + j) * sizeof(元素类型)
4.2 与一维数组的关联
// 将二维数组视作连续内存访问
int arr2D[2][3] = {1,2,3,4,5,6};
int* arr1D = &arr2D[0][0];
// 通过一维指针访问
cout << arr1D[2*3 + 1]; // 等价于arr2D[2][1]
五、工程实践建议
5.1 参数传递规范
// 正确传递二维数组参数
void printMatrix(int mat[][5], int rows) {
for(int i=0; i<rows; ++i) {
for(int j=0; j<5; ++j) {
cout << mat[i][j] << " ";
}
cout << endl;
}
}
5.2 动态内存方案
// 动态创建二维数组
int** create2DArray(int rows, int cols) {
int** arr = new int*[rows];
for(int i=0; i<rows; ++i) {
arr[i] = new int[cols];
}
return arr;
}
六、典型应用场景
6.1 游戏地图系统
// 10x10游戏地图
char gameMap[10][10] = {
{'#','#','#','#','#','#','#','#','#','#'},
{'#',' ',' ',' ','#',' ',' ',' ',' ','#'},
{'#',' ','$',' ','#',' ','@',' ',' ','#'},
// ... 其他行数据
};
6.2 学生成绩管理
const int STUDENTS = 50;
const int COURSES = 5;
double gradeTable[STUDENTS][COURSES];
// 录入第3个学生的成绩
gradeTable[2][0] = 89.5; // 数学
gradeTable[2][1] = 78.0; // 英语
// ... 其他科目
七、常见错误排查
- 维度混淆错误:
int arr[3][4];
arr[4][2] = 5; // 行下标越界(最大2)
- 初始化不匹配:
int arr[2][3] = {{1,2}, {3}}; // 第二行自动补零→{3,0,0}
八、综合训练题
题目1:储物柜
储物柜,共5层,每层有5个抽屉,每个抽屉里都放了价值为x元(随机生成1000元以内)的物品。你的任务是找出哪个抽屉里的物品价值最高,为多少元?
例如:第二行第四个抽屉存放的物品价值最高,801元。
参考代码:
int a[5][5];
srand(time(0));//生成随机数的种子 头文件<ctime>
for(int i=0; i<5; i++) //表示层数,这里是5层
{
for(int j=0; j<5; j++)//表示列数,这里是5列
{
a[i][j]=rand()%1000;
}
}
for(int i=0; i<5; i++) //循环输出每层
{
for(int j=0; j<5; j++)//循环输出每列
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
int m=a[0][0];//定义一个最大值
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
if(a[i][j]>m)//通过交换得到最大值
{
m=a[i][j];
}
}
}
cout<<"最大值为:"<<m;
题目2:打印图形
请输入一个数字n,在屏幕上输出符合图示图形规律的n×n的图形。
例如:输入5,会输出下列图形:
参考代码:
int i,j;
char a[5][5];
int n;
cin>>n;
for(i=0; i<n; i++)//一共有几层
{
for(j=0; j<n; j++)
{
if(i<j)//纵坐标大于横坐标
{
a[i][j]='-';
}
if(i==j) //纵坐标和横坐标都是相等的
{
a[i][j]='+';
}
if(i>j) //横坐标大于纵坐标
{
a[i][j]='*';
}
}
}
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
热门推荐
曾权倾朝野,却落得人人喊打,司马氏为何如此招人恨?
肺癌骨转移缓解疼痛的办法是什么
腊月二十九:蒸馒头、上坟请祖,这些传统习俗你知道多少?
杭州三日游图文攻略:京杭大运河、西湖、飞来峰灵隐寺
如何以涨工资为目的辞职?这份职场指南请收好
洋葱是糖尿病的“缓和剂”?医生劝告:不想血糖飙升,多吃这3物
气体保护焊焊接:安全高效操作的关键注意事项
小卫生间逆袭指南!5大省空间设计打造实用颜值双满分
血透患者的“吃”有讲究
20万辆交付神话背后:小米汽车如何跨越安全“生死关”?
前瞻:利物浦客战埃弗顿,6分优势能否保住?
鼠标垫材质选择指南:皮革 vs 橡胶,如何挑选最适合你的鼠标垫?
表达强烈的冲击力:如何用更精准的词语代替“震撼”
饺子制作宝典:工具花样图解教学,轻松学会多种技巧
钢管漏水简单补救,钢管渗漏处理方法
如何解决室内下水管漏水的问题?这个问题怎样进行彻底修复?
如何组建一支宝可梦队伍?——组队教学上篇
新政策助力,成交量上升,青岛楼市迎来“小阳春”
关于茶的经典名句群
早知道早做准备!315晚会曝光内幕,不出所料社会将出现的6大变化
签了合同的培训班可以退钱吗
银行的定期存款利率在不同银行之间差异大吗?
jpg格式图片转word,怎么转
属猴的是不是很花心呀?属猴男对感情负责吗
猴克虎还是虎克猴:五行相生相克的奥秘
西安邮电大学王牌专业 最好的专业是什么
2024年度香港保险业十大新闻
在太行山区,有一片“豹乡田”
全国汽车报废更新补贴申请已超过80万份,可通过懂车帝App申领
项目式学习如何与跨学科学习互嵌融通?浙江一所学校的实践探索