8.2.2 多维数组的用法
1.定义多维数组
C语言中,在定义多维数组时也是通过数组定义语句实现的,具体格式如下:
存储类型 数据类型 数组名[长度1][长度2]...[长度k]
其中数组元素的一般表示格式如下。
数组名[下标1][下标2]...[下标k]
上述格式的具体说明如下。
(1)存储类型、数据类型、数组名、长度的选取同一维数组。
(2)一个数组定义语句可以只定义一个多维数组,也可以定义多个多维数组,可以在一个定义语句中同时定义一维和多维数组,还可以同时定义数组和变量。
(3)一个二维数组可以看成是若干个一维数组。例如二维数组a[2][3]可以看成是两个长度为3的一维数组,这两个一维数组的名字分别为a[0]、a[1]。其中名为a[0]的一维数组元素是a[0][0]、a[0][1]、a[0][2];名为a[1]的一维数组元素是a[1][0]、a[1][1]、a[1][2]。同样,一个三维数组可以看成是若干个二维数组。
(4)二维数组中的元素在内存中是先按行后按列的次序进行排列的。例如,一个二维数组a[2][3]中的9个元素在内存中的排列如下所示。
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
2.初始化多维数组
多维数组的初始化(即给数组元素赋初值)和一维数组初始化方法相同,也是在定义数组时给出数组元素的初值。多维数组的初始化可以分为下列5种方式。
(1)分行给多维数组中的所有元素赋初值。例如下面的格式。
int a [a][3]={{1, .2,3}, {4,5,9}};
其中,{1,2,3}是赋值给第1行的3个数组元素,它可以看成是赋值给一维数组a[0];{4, 5,9}是赋值给第2行的3个数组元素,它可以看成是赋值给一维数组a[1]。
(2)不分行给多维数组中的所有元素赋初值。例如:
int a [2][3]={1,2,3,4,5,9};
各元素获得的初值和第一种方式的结果完全相同。C语言规定,用这种方式给二维数组赋初值时,是先按行后按列的顺序进行的,即前3个初值是给第1行的,后3个初值是第2行的。
(3)只对每行中前面的若干个元素赋初值。例如:
int a[2][3]={{1}, {4,5}};
经过上述赋值后,数组a的各个元素值如下。
a[0][0]值为1,a[0][1]值为0,a[0][2]值为0,a[1][0]值为4,a[1][1]值为5, a[1][2]值为0。
(4)只对前若干行的前若干个元素赋初值。例如:
static int a[2][3]={{1,2}};
经过赋值后,数组a的元素值如下。
a[0][0]值为1,a[0][1]值为2,a[0][2]值为0,a[1][0]值为0,a[1][1]值为0, a[1][2]值为0。
(5)若给所有元素赋初值,则第一维长度可以省略。例如:
int a[][3]={{1,2,3}, {4,5,9}};
或
int a[][3]={1,2,3,4,5,9};
上述赋值后,数组a[][3]的第一维长度是2。
注意:使用第5种方式赋初值时,必须给出所有数组元素的初值,如果初值的个数不正确,则系统会作为错误来处理。
3.引用多维数组
在定义了k维数组之后,就可以引用这个k维数组中的任何元素。具体引用方法如下所示:
数组名[下标1][下标2]...[下标k]
其中,“下标1”为第一维的下标,“下标2”为第二维的下标,“下标k”为第k维的下标。这种引用多维数组元素的方法也称为“下标法”。同样也需要注意的是,下标越界会造成运行结果产生不可预料的问题。例如定义数组为“a[3][2]”,能合法使用的数组元素是a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1]。
在多维数组元素中,也允许使用“指针方式”来引用数组元素,这称为“指针法”。和一维数组元素的引用方式相同,任何多维数组元素的引用都可以看成是使用一个变量,它可以赋值,可以参与组成表达式。
实例8-4
提示用户分别输入用户编号和3科考试成绩,并在界面中输出总分最高的用户编号和总成绩
源码路径daima\8\8-4
本实例的实现文件为“duowei.c”,具体实现代码如下。
#include"stdio.h" int main(void) { int s[3][5], i, max, max_i; for(i=0; i<3; i++) { /*输入用户的编号和3科成绩,并计算总分*/ printf("input no%d, s1, s2, s3:\n", i+1); scanf("%d, %d, %d, %d", &s[i][0], &s[i][1], &s[i][2], &s[i][3]); s[i][4]=s[i][1]+s[i][2]+s[i][3]; } max=s[0][4], max_i=0; /*设第1个用户为当前总分最高 的用户*/ for (i=1; i<3; i++) /*循环求总分最高的用户*/ if(max<s[i][4]) max=s[i][4], max_i=i; printf("student no=%d total=%d\n", s[max_i][0], s[max_i][4]); }
拓展范例及视频二维码
范例8-4-01:实现两个矩阵相乘
源码路径:演练范例\8-4-01\

范例8-4-02:简单的成绩管理系统
源码路径:演练范例\8-4-02\

其中,数组s[10][5]中存储10个学生的编号、3门课程的考试成绩、总分,s[i][0]存放编号,s[i][1]、s[i][2]、s[i][3]存放成绩,s[i][4]存放总分。
程序执行后先提示用户输入指定格式的数据,要求分别输入用户编号和3门课的成绩,按下Enter键后将持续输入。输入完毕按下Enter键后,将在界面中显示总分最高的用户编号和总分成绩,如图8-4所示。

图8-4 运行结果