一、使用二维数组的场景
假如你还是那个班主任,需要知道整个班30名学生的成绩,而且每个班的学生分为6个学习小组,即每个组有5个学生,要将他们的成绩用数组保存下来方便日后观察学生的成绩变化,以此来观察学习小组的学习成果,用第一维表示第几个小组(作为行),第二维表示第几个学生(作为列)。如下图所示。
组员1 | 组员2 | 组员3 | 组员4 | 组员5 | |
第一组 | 86 | 64 | 64 | 68 | 43 |
第二组 | 31 | 85 | 42 | 23 | 45 |
第三组 | 76 | 97 | 34 | 56 | 65 |
第四组 | 23 | 23 | 54 | 86 | 54 |
第五组 | 43 | 53 | 65 | 35 | 53 |
第六组 | 22 | 65 | 67 | 96 | 34 |
二、二维数组的定义
二维数组的一般形式:
<数据类型> <数组名> [常量表达式1] [常量表达式2]
例如:int a[3][4]
定义a为3×4数据类型为整型的数组
三、二维数组的存储方式
其实二维数在内存的存储是一维的。
二维数组在C语言中的排列顺序是按行排放的,即在内存中先存放第1行的元素,再存放第2行的元素。如下图所示是a[3][4]数组存放的序列
a[3][4]
代码验证一下,是否如此?
#include <stdio.h>
int main()
{
int a[2][3], i, j;//定义2行3列的数组
for(i = 0;i < 2;i ++){
for(j = 0;j < 3;j ++)
printf("%p\n", &a[i][j]);
}
return 0;
}
运行结果:
0xbfc50398是a[0][0]的地址,0xbfc5039c是a[0][1]的地址……
确实如此!
四、二维数组元素的引用
1、二维数组元素的表达形式为:
数组名[下标][下标]
注意:在引用元素时,下标值应在已定义的数组大小的范围内。例如:int a[3][4];
声明行数时可以省略,但列数不可以。
2、二维数组初始化:
①分行初始化
例如:
int a[2][3] = {{1,2,3}{4,5,6}};
1 | 2 | 3 | 4 | 5 | 6 |
a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] |
②按元素列表顺序初始化
③对部分元素赋初始值
例如:
int a[2][3] = {{1}{6}};
第一列 | 第二列 | 第三列 | |
a[0] | 1(a[0][0]) | 0(a[0][1]) | 0(a[0][2]) |
a[1] | 6(a[1][0]) | 0(a[1][1]) | 0((a[1][2])) |
只对部分元素赋初值而省略第1维的长度(即忽略行数),例如:
int a[][3] = {{1,4,8}{5}};
第一列 | 第二列 | 第三列 | |
a[0] | 1(a[0][0]) | 4(a[0][1]) | 8(a[0][2]) |
a[1] | 5(a[1][0]) | 0(a[1][1]) | 0((a[1][2])) |
五、二维数组的经典例子
经典:打印杨辉三角形
什么是杨辉三角呢?
tips:不能一下子上来就敲代码的问题,要先打印出框架,再改数值。
比如说:通过观察,可发现:
(1)第一列和对角线上的数都是1;(这作为框架)
(2)从第三行起,除上面的第一个数和最后一个数外,其余数都是上一行同列和前一列两个数的和。(改变其他数的数值)
代码实现:
#include <stdio.h>
int main()
{
int i,j;
int a[10][10];
// = {{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}};
for(i = 0;i < 10;i ++){
a[i][0] = 1;
a[i][i] = 1;
}
for(i = 2;i < 10;i ++){
for(j = 1;j < i;j ++){
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
//打印模块
for(i = 0;i < 10;i ++){
for(j = 0; j <= i;j ++){
printf("%d ", a[i][j]);
}printf("\n");
}printf("\n");
return 0;
}