上一篇 <一起学习C语言:数组(一)> 中,我们了解了一维数组语法和一维字符数组的应用场景。本篇文章中,我们分析二维数组语法,并通过二维数组示例来了解二维数组的初始化赋值、存储方式。
章节预览:
4. 二维数组的声明
5. 二维数组的初始化赋值
6. 二维整数类型数组使用
目录预览
章节内容:
4. 二维数组的声明
二维数组属于一个具有固定大小,元素类型相同的一维数组顺序集合。二维数组通过指定元素类型、变量名、一维数组个数 (5) 、一维数组元素个数 (6),完成使用前的声明。
二维数组的声明形式:
元素类型 变量名[一维数组个数][ 一维数组元素个数];
二维数组的声明举例:
int a[5][2];
char a[5][2];
float a[][2] = {0.1, 0.2};
(5):一维数组个数,即二维数组的元素个数,表示二维数组的成员数量。二维数组成员也是从下标0 (7) 开始,即[0],表示二维数组的第一个(一维数组)成员。
(6):一维数组元素个数,即二维数组每个成员的元素个数,表示二维数组中的一维数组成员数量,数组成员从下标0开始,即[0][0],表示二维数组的第一个成员的第一个成员。一维数组元素个数是大于0的常量整数,比如1、1 + 1,也可以是大于0的宏常量整数。
(7):二维数组中包含一维下标和二维下标。比如a[5],它属于一维下标,它的下标范围在0-4,可以访问二维数组中第一个至第五个成员;a[n][2],它属于二维下标,它的下标范围在0-1,可以访问二维数组中第n个成员的第一个至第二个成员。
5. 二维数组的初始化赋值
二维数组声明时的初始化,可以按整行赋值、分段赋值,也可以混合赋值。此外,二维数组声明时可以不指定一维下标个数(一维数组个数),但必须初始化赋值。
二维数组整行初始化赋值:
float a[5][2] = {1.1}; //转换到第一个成员中的第一个成员(a[0][0])赋值为1.1,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0
float a[5][2] = {0.0}; //转换到第一个成员中的第一个成员(a[0][0])赋值为0.0,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0,这种方式可以看做数组中的所有成员中的成员值清零
float a[5][2] = {1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0}; //转换到所有成员中的成员赋值
float a[][2] = {1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9}; //转换到成员a[0][1]、a[1][0]、a[1][1]…a[4][0]按顺序赋值,a[4][1]自动赋值为0.0,一维下标个数为5
二维数组分段初始化赋值:
float a[5][2] = {{1.1}}; //只为第一个成员中的第一个成员(a[0][0])赋值为1.1,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0
float a[5][2] = {{0.0}}; //只为第一个成员中的第一个成员(a[0][0])赋值为0.0,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0,这种方式可以看做数组中的所有成员中的成员值清零
float a[5][2] = {{1.1, 1.2}, {1.3}, {1.5}, {1.7}, {1.9, 2.0}}; //指定成员中的成员进行赋值,其余成员自动赋值为0.0,这段初始化赋值语句等同于{{1.1, 1.2}, {1.3, 0.0}, {1.5, 0.0}, {1.7, 0.0}, {1.9, 2.0}}
float a[][2] = {{1.1, 1.2}, {1.3}, {1.5}, {1.7}, {1.9, 2.0}}; //指定成员中的成员进行赋值,其余成员自动赋值为0.0,这段初始化赋值语句等同于{{1.1, 1.2}, {1.3, 0.0}, {1.5, 0.0}, {1.7, 0.0}, {1.9, 2.0}},一维下标个数为5
二维数组混合初始化赋值(不推荐):
float a[5][3] = {1.1, {1.2}, 1.3, {1.4, 1.5, 1.6}, {1.7}, 1.8, {1.9}, 2.0, {2.1, 2.2, 2.3}}; //这段初始化赋值语句等同于{1.1, 1.2, 1.3, {1.4, 1.5, 1.6}, {1.7, 0.0, 0.0}, 1.8, 1.9, 2.0, {2.1, 2.2, 2.3}}
float a[][3] = {1.1, {1.2}, 1.3, {1.4, 1.5, 1.6}, {1.7}, 1.8, {1.9}, 2.0, {2.1, 2.2, 2.3}}; //与float a[5][3]初始化赋值效果相同,一维下标个数为5
使用混合初始化赋值需要考虑数据对齐等因素,比如二维下标个数为3,当对应的一维数组的第一个成员采用整行形式赋值后,第二个成员采用分段形式赋值也与整行形式赋值效果相同,并且第二个成员或之后的成员分段形式赋值中,只能进行单个成员赋值。
6. 二维整数类型数组使用
二维数组一般当作数学中的行列矩阵使用,一维成员一般按行表示,二维成员一般按列表示。比如学生1的所有科目成绩表示一行内容,所有学生的语文成绩表示一列内容。
【例6.4】 通过二维数组记录五名学生的语文、数学考试成绩,并分别输出学生们的两次考试总成绩、语文考试平均成绩、数学考试平均成绩。
学生 | 语文考试成绩 | 数学考试成绩 |
---|---|---|
学生1 | 88 | 95 |
学生2 | 90 | 86 |
学生3 | 75 | 79 |
学生4 | 66 | 80 |
学生5 | 95 | 99 |
int grade[5][2] = {{88, 95}, {90, 86}, {75, 79}, {66 ,80}, {95, 99}};
int chinese = 0, math = 0;
int one_dimensional = sizeof(grade) / sizeof(*grade);
int two_dimensional = sizeof(*grade) / sizeof(int);
int i = 0, j = 0; //i表示一维下标,j表示二维下标
printf(“二维数组->地址:%p.\n\n”, grade);
for (; i < one_dimensional; i++) {
for (j = 0; j < two_dimensional; j++) {
printf(“一维成员%d ->地址:%p, 二维成员%d ->值:%d 地址:%p.\n”, i + 1, grade[i], j + 1, grade[i][j], &(grade[i][j]));
(j == 0) ? chinese += grade[i][j] : math += grade[i][j]; //二维下标值0表示语文成绩,二维下标值1表示数学成绩
if (j == two_dimensional - 1)
printf(“学生%d:总成绩是%d分.\n\n”, i + 1, grade[i][j - 1] + grade[i][j]);
}
}
printf(“学生们的语文平均成绩是%d分.\n”, chinese / one_dimensional);
printf(“学生们的数学平均成绩是%d分.\n”, math / one_dimensional);
示例结果:
二维数组->地址:004FFE4C.
一维成员1 ->地址:004FFE4C, 二维成员1 ->值:88 地址:004FFE4C.
一维成员1 ->地址:004FFE4C, 二维成员2 ->值:95 地址:004FFE50.
学生1:总成绩是183分.
一维成员2 ->地址:004FFE54, 二维成员1 ->值:90 地址:004FFE54.
一维成员2 ->地址:004FFE54, 二维成员2 ->值:86 地址:004FFE58.
学生2:总成绩是176分.
一维成员3 ->地址:004FFE5C, 二维成员1 ->值:75 地址:004FFE5C.
一维成员3 ->地址:004FFE5C, 二维成员2 ->值:79 地址:004FFE60.
学生3:总成绩是154分.
一维成员4 ->地址:004FFE64, 二维成员1 ->值:66 地址:004FFE64.
一维成员4 ->地址:004FFE64, 二维成员2 ->值:80 地址:004FFE68.
学生4:总成绩是146分.
一维成员5 ->地址:004FFE6C, 二维成员1 ->值:95 地址:004FFE6C.
一维成员5 ->地址:004FFE6C, 二维成员2 ->值:99 地址:004FFE70.
学生5:总成绩是194分.
学生们的语文平均成绩是82分.
学生们的数学平均成绩是87分.
程序分析:
参考图6-3,二维数组的一维成员储存的是一维数组地址,二维数组的二维成员储存的是一维数组中的成员值。另外,从示例结果中,可以分析出二维数组的首地址与数组首个一维成员地址相同,一维成员地址与一维成员中的首个二维成员地址相同。
目录预览
<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>
<一起学习C语言:C语言数据类型(二)>
<一起学习C语言:C语言数据类型(三)>
<一起学习C语言:C语言基本语法(一)>
<一起学习C语言:C语言基本语法(二)>
<一起学习C语言:C语言基本语法(三)>
<一起学习C语言:C语言基本语法(四)>
<一起学习C语言:C语言基本语法(五)>
<一起学习C语言:C语言循环结构(一)>
<一起学习C语言:C语言循环结构(二)>
<一起学习C语言:C语言循环结构(三)>
<一起学习C语言:数组(一)>