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 运行结果