二维数组

 

 首先了解定义和语法:

用法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

 

posted @ 2022-10-09 15:05  Morning枫  阅读(103)  评论(0编辑  收藏  举报