二维数组简介
二维数组是一种特殊类型的数组,它允许以表格(行和列)的形式存储数据。以下是对二维数组的详细介绍:
定义与结构
- 定义
二维数组是一种数据结构,其元素本身为一维数组。在C++等编程语言中,二维数组可以被视为数组的数组,即数组的数组名[行号][列号]
。 - 结构
二维数组由多个一维数组组成,这些一维数组在内存中连续存储。每个一维数组代表二维数组中的一行,而一维数组中的元素则代表该行中的列
声明与初始化
- 声明
在C++中,二维数组的声明格式通常为数据类型 数组名[常量表达式1][常量表达式2]
,其常量表达式1
表示第一维(行)的长度,常量表达式2
表示第二维(列)的长度 - 初始化
二维数组可以在声明时进行初始化,也可以逐个元素地进行赋值。初始化时,可以使用嵌套的花括号来指定每个一维数组(即每行)的元素值
内存存储与访问
- 内存存储
二维数组在内存中是连续存储的,这种存储方式有助于提高数据访问的效率。连续的内存地址可以更快地被CPU访问,从而加快程序的运行速度 - 访问方式
- 通过指定行号和列号来访问二维数组中的元素。例如,在C语言中,可以使用“数组名[行号][列号]”的方式来访问二维数组中的特定元素
应用与实例
- 应用
二维数组在图像处理、游戏开发等领域有着广泛的应用。例如,在图像处理中,一个图像可以被表示为一个二维数组,其中每个元素代表图像中的一个像素。在游戏开发中,二维数组常用来表示游戏世界中的地图或者棋盘 - 实例
- 以下是一个简单的C++程序示例,展示了如何声明、初始化和访问二维数组
#include<bits/stdc++.h> // c++万能头文件
#define int long long // 宏命令,可省略
using namespace std;
signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
int shuzu[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 定义和初始化
// 注意,数组的下标从0开始。第一个中括号表示该二维数组含有的一维数组数量,第二个中括号表示每个一维数组的元素个数。注意控制好元素个数,以免下标越界
cout << shuzu[2][1] << endl; // 将会输出 8
}
在这个例子中,我们声明了一个3
行3
列的整型二维数组,并使用嵌套的大括号初始化了它的元素。然后,我们通过数组[2][1]
访问了数组中第三行第二列的元素,并打印出了它的值(8
)。
注意事项
- 越界问题
在访问二维数组时,需要注意不要越界。如果尝试访问不存在的行或列,将会导致程序崩溃或产生未定义的行为 - 初始化问题
在初始化二维数组时,需要确保提供的元素数量与数组的大小相匹配。如果提供的元素数量少于数组的大小,则未初始化的元素将具有不确定的值
综上所述
二维数组是一种强大且灵活的数据结构,它允许以表格的形式存储和组织数据。通过深入理解和正确使用二维数组,可以编写出更加高效和可靠的程序。
二维数组练习题+详解
为了更好地理解二维数组,我上网找到了一道题目,将以此题作为样例讲解二维数组
读题与分析
题目中说到相邻的八个数,仔细观察它们的位置。
这时我们发现这几个数对于指定的坐标数的相对位置,也就是行和列有变化规律,例如:
- 在正上方的数相对于指定数就是行数减一,列不变
- 在正下方的数相对于指定数就是行数加一,列不变
- 在右上方的数相对于指定数就是行数加一,列加一
- ……
发现了规律,再加入二维数组,题目就变得好做了
编程实现
首先,写好祖传的头文件、宏命令和main函数:
#include<bits/stdc++.h> // c++万能头文件
#define int long long // 宏命令,可省略
using namespace std;
signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
}
接下来是定义和输入
输入时注意行和列的遍历,小心越界
int h, l, hh, ll; // 本人懒了,h l是行列数,hh ll是指定的数的坐标
int a[100][100] = {}; // 定义二维数组+初始化(初始化为零)
cin >> h >> l >> hh >> ll; // 输入数据
for(int i = 0; i < h; ++i){ // 循环行的个数
for(int j = 0; j < l; ++j){ // 循环列的个数
cin >> a[i][j]; // 输入数据(数组元素)
}
}
数据保存完毕,然后是处理数据:访问目标位置周围的八个数字
存储下来后在求和
// 打表中......
int c = a[hh - 1][ll - 1] + a[hh + 1][ll + 1]; // 左上+右下
int d = a[hh - 1][ll + 1] + a[hh + 1][ll - 1]; // 右上+左下
int f = a[hh + 1][ll] + a[hh][ll + 1]; // 正上+正右
int g = a[hh - 1][ll] + a[hh][ll - 1]; // 正下+正左
数据存储完了,剩下的只剩求和、输出了
上代码:
cout << c + d + f + g;
整理下思路,最后放完整代码
#include<bits/stdc++.h> // c++万能头文件
#define int long long // 宏命令,可省略
using namespace std;
signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
int h, l, hh, ll; // 本人懒了,h l是行列数,hh ll是指定的数的坐标
int a[100][100] = {}; // 定义二维数组+初始化(初始化为零)
cin >> h >> l >> hh >> ll; // 输入数据
for(int i = 0; i < h; ++i){ // 循环行的个数
for(int j = 0; j < l; ++j){ // 循环列的个数
cin >> a[i][j]; // 输入数据(数组元素)
}
}
int c = a[hh - 1][ll - 1] + a[hh + 1][ll + 1]; // 左上+右下
int d = a[hh - 1][ll + 1] + a[hh + 1][ll - 1]; // 右上+左下
int f = a[hh + 1][ll] + a[hh][ll + 1]; // 正上+正右
int g = a[hh - 1][ll] + a[hh][ll - 1]; // 正下+正左
cout << c + d + f + g;
}
自测一下:
输入数据1:
4 5 2 3
1 2 3 4 5
6 7 8 9 10
3 4 5 7 8
2 5 6 8 0
输出1:
54
输入数据2:
4 5 1 0
1 2 3 4 5
6 7 8 9 10
3 4 5 7 8
2 5 6 8 0
输出2:
17
我们提交代码看看:
获得了满分,看来二维数组我们已经初步掌握了,相信大家都学会了