二维数组
![](https://img2022.cnblogs.com/blog/2954941/202210/2954941-20221008233144762-1189780964.png)
首先了解定义和语法:
用法1——先定义再初始化
入门案例:
同时分析它的内存布局:
内存布局如下:
代码如下:
1 #include <stdio.h> 2 3 void main(){ 4 int a[4][6]; //表示一个4行6列的二维数组,此时数组里面全是垃圾值,需要初始化 5 int i, j; 6 for(i = 0; i < 4; i++){ //进行初始化,全部赋值为0 7 for (j = 0; j < 6; j++){ 8 a[i][j] = 0; 9 } 10 } 11 a[1][2] = 1; 12 a[2][1] = 2; 13 a[2][3] = 3; 14 for(i = 0; i < 4; i++){ //输出二维数组 15 for (j = 0; j < 6; j++){ 16 printf("%d", a[i][j]); 17 } 18 printf("\n"); 19 } 20 //康康二维数组的内存布局叭 21 printf("\n二维数组a的首地址=%p", a); 22 printf("\n二维数组a[0]的地址=%p", a[0]); 23 printf("\n二维数组a[0][0]的地址=%p", &a[0][0]); 24 printf("\n二维数组a[0][1]的地址=%p", &a[0][1]); 25 //输出二维数组的各个元素的地址 26 printf("\n"); 27 for(i = 0; i < 4; i++){ 28 printf("a[%d]的地址=%p", i, a[i]); 29 for (j = 0; j < 6; j++){ 30 printf("a[%d][%d]的地址=%p\n", i, j, &a[i][j]); 31 } 32 printf("\n"); 33 } 34 }
运行后可知:
1.二维数组a的首地址==二维数组a[0]的地址==二维数组a[0][0]的地址
2.二维数组a[0][1]的地址==二维数组a[0][0]的地址+4(int类型字节大小,如二维数组a[0][0]的地址为:0045FE70,则二维数组a[0][1]的地址为:0045FE74;当然也可以是:二维数组a的首地址+4 或者是:二维数组a[0]的地址+4)
3.牢记数组在内存是连续分布的,各个元素的地址是连续分布的,如图(认真观察每一行的地址尾数):
用法2——直接初始化
二维数组的应用:
1.
灵活方式:数组变化的话只需要修改数组即可
1 #include <stdio.h> 2 3 void main(){ 4 int map[3][3] = {{0,0,1},{1,1,1},{1,1,3}}; 5 //遍历 6 //先得到行 7 //1.sizeof(map) 得到这个map数组的大小,9int * 4(int字节) =36 8 //2.sizeof(map[0]) 得到map中,第一行有多大,3int * 4(int字节) = 12 9 int rows = sizeof(map) / sizeof(map[0]); //36/12=3 10 //printf("rows=%d", rows); 11 12 //再得到列 13 int cols = sizeof(map[0]) / sizeof(map[0][0]); //sizeof(map[0][0])可用sizeof(int)代替 14 15 //输出 16 for(int i = 0; i<rows; i++){ 17 for (int j = 0; j<cols; j++){ 18 printf("a[%d][%d] = %d ", i, j ,map[i][j]); 19 } 20 printf("\n"); 21 } 22 }
2.
1 #include <stdio.h> 2 3 void main(){ 4 int arr[3][3] = {{4,6},{1,4},{-2,8}}; 5 int sum = 0; 6 //遍历 7 //先得到行 8 //1.sizeof(arr) 得到这个arr数组的大小,9int * 4(int字节) =36 9 //2.sizeof(arr[0]) 得到arr中,第一行有多大,3int * 4(int字节) = 12 10 int rows = sizeof(arr) / sizeof(arr[0]); //36/12=3 11 //printf("rows=%d", rows); 12 13 //再得到列 14 int cols = sizeof(arr[0]) / sizeof(arr[0][0]); //sizeof(arr[0][0])可用sizeof(int)代替 15 16 //输出 17 for(int i = 0; i<rows; i++){ 18 for (int j = 0; j<cols; j++){ 19 sum += arr[i][j]; //累加 20 } 21 } 22 printf("sum = %d", sum); 23 }
3.
1 #include <stdio.h> 2 3 void main(){ 4 double score[3][5]; 5 int rows = 3, cols = 5; 6 double classTotalScore = 0.0, totalScore = 0.0; 7 for (int i = 0; i < rows; i++){ //初始化 8 for (int j = 0; j < cols; j++){ 9 score[i][j] = 0; 10 } 11 } 12 for (int i = 0; i < rows; i++){ //保存数值 13 for (int j = 0; j < cols; j++){ 14 printf("请输入第%d班的第%d个学生的成绩:", i+1, j+1); 15 scanf("%lf", &score[i][j]); 16 } 17 } 18 for (int i = 0; i < rows; i++){ //计算每个班的平均分和全部班的平均分总分 19 classTotalScore = 0.0; 20 for (int j = 0; j < cols; j++){ 21 classTotalScore += score[i][j]; 22 } 23 printf("第%d班级平均分为:%.2f\n", i+1, classTotalScore/cols); 24 totalScore += classTotalScore; 25 } 26 printf("所有班级总分分为:%.2f", totalScore); 27 printf("所有班级平均分为:%.2f", totalScore/rows); 28 }
细节注意:
关于第一点:
如此定义后,则整个输出的数组为:
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
1 0 0 0 0