C/C++之二维数组
上节我们分析了内联函数和递归函数的使用。C/C++之内联函数与递归函数
本节我们介绍二维数组。
-
二维数组和一维数组不同,一维数组可以比作一条直线,而二维数组就是一个平面。
例子:阅兵时候的方阵,有行和列。与二维数组很类似,也有行列!也和数学中的矩阵很相似! -
二维数组的定义: 只需要多加一个[]运算符即可!
一维数组:int a[10];
二维数组:int a[10][10];
-
二维数组的初始化
定义了不初始化,二维数组里面的值是随机的。-
第一种:
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
也可以这样写:
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
-
第二种:
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
-
第三种:支持全局初始化: 例如
int a[3][4] = {0};
-
第四种:初始化部分元素:
int a[3][4] = {{1, 2}, {5, 6, 7}, {9, 10, 11, 12}};
未初始化的元素充0 -
补充,使用第一种或者第四种的时候,第一个[]内可以不用写大小。例如:
int a[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
编译器自动获取多少行。
-
-
二维数组的访问: 访问第i行第j列的元素使用
a[i - 1][j - 1];
注意: 和一维数组一样,行标和列标都从0开始!
例子:遍历数组#include <iostream> using namespace std; int main(){ int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; for(int i = 0; i < 3; i++){ for(int j = 0; j < 4; j++){ cout << a[i][j] << "\t"; } cout << endl; } return 0; }
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12
具体的数组如下图:
a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
a[0][0]
1a[0][1]
2a[0][2]
3a[0][3]
4a[1][0]
4a[1][1]
5a[1][2]
6a[1][3]
7a[2][0]
9a[2][1]
10a[2][2]
11a[2][3]
12 -
注意: 不能越界访问!!!例如
a[3][4]
是没有元素a[m][4]或者a[3][n]
的,会报错! -
使用循环对二维数组赋值:
-
最简单的方法两重循环(最好理解)
#include <iostream> using namespace std; int main(){ int a[3][4]; //给二维数组赋值1 ~ 12 //最简单 for(int i = 0; i < 3; i++){ for(int j = 0; j < 4; j++){ a[i][j] = i * 4 + j + 1; } } for(int i = 0; i < 3; i++){ for(int j = 0; j < 4; j++){ cout << a[i][j] << "\t"; } cout << endl; } return 0; }
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12
-
使用一重循环的方式
#include <iostream> using namespace std; int main(){ int a[3][4]; //给二维数组赋值1 ~ 12 for(int i = 0; i < 12; i++){ a[i / 4][i % 4] = i + 1; } for(int i = 0; i < 3; i++){ for(int j = 0; j < 4; j++){ cout << a[i][j] << "\t"; } cout << endl; } return 0; }
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12
-
-
补充: 二维数组定义为全局变量会自动赋值为0;
-
储存方式:
一维数组是按照顺序在内存中存储的,二维数组同样也是。
例如:a[3][4]
在内存中,先按顺序存第一行的四个元素,再存第二行的元素,以此类推。与a[12]
类似
-
在vs中调试可以看到对应的地址与数据。以上面的代码为例子:
很直观的看到数组的地址和值a[0]、a[1]、a[2]每个地址差0x10(16进制)十进制差16。(注意:
a[3][4]
的起始地址和a[0][0]
相同)
结论:数组在内存中是连续的。
更加直观的方式:
连续!!!! 每一个数相差4字节(一个int)
-
补充:更高维数组,很少使用多维数组。
例如:int a[2][3][4]
表示有2个a[3][4]
数组。与二维数组差不多,只是维度高一维而已。
此处初始化a[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}}
}
-
二维数组做函数的参数:
与一维数组一样,不是单纯的值传递,而是传递的数组本身。详细的介绍在之前已经做过解释了。C/C++之自定义函数#include <iostream> using namespace std; //定义scorePrint打印score中的成员。 void scorePrint(int score[][5]){ //数组形参本质上是指针。等价于int* score; cout << sizeof(score) << endl; } int main(){ //两个班的同学成绩。 int score[2][5] = {59, 60, 79, 89, 99}; //打印数组大小4 * 5 cout << sizeof(score) << endl; corePrint(score); return 0; }
输出结果:
40 4
说明: 传递到函数中的数组实际上是一个指针(int*)只有4字节大小,通过指针来访问数组中的值。
本节介绍了二维数组的内容。下节讲指针!!!!!重点!!