一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。 在实际问题中,很多量是二维的或多维的,所以C语言允许构造多维数组。 多维数组元素有多个下标来标识它在数组中的位置,所以也称为多下标变量。 本节只介绍二维数组,多维数组可以类推二维数组得到。
1、二维数组的定义
二维数组定义的一般形式是:
类型说明符数组名[常量表达式 1][常量表达式 2]
常量表达式1表示下标在第一维的长度,常量表达式2表示下标在第二维的长度。 例如:
描述了一个三行四列的数组,数组名为a,其下标变量类型为整型。 这个数组中有3×4个下标变量,即:
二维数组在概念上是二维的,也就是说它的下标在两个方向上变化,下标变量在数组中的位置也是在一个平面内,而不是像一维那样只是一个向量大批。 而实际的硬件内存是连续寻址的,也就是说,内存单元在一维空间内是线性排列的。 如何在一维内存中存储二维数组,有两种方式:一种是按行排列,即放在一行之后的第二行。 另一种是按列排列,即放置一列后,依次放入第二列。
在C语言中,二维数组是按行排列的。 即先存a[0]行,再存a[1]行,最后存a[2]行。 每行有四个元素被顺序存储。 由于数组a被描述为int类型,该类型占用两个字节的内存空间,所以每个元素占用两个字节。
2.二维数组元素的引用
二维数组的元素也称为双下标变量,它们的表示形式为:
数组名[下标][下标]
下标应该是整型常量或整型表达式。 例如:
表示a数组的三行四列的元素。
下标变量和数组声明在形式上有些相似,但两者的含义却完全不同。 数组描述中的方括号表示某一维的长度,即下标的最大值; 数组元素中的下标为该元素在数组中的位置标识。 前者只能是常量,后者可以是常量、变量或表达式。
【例1】一个学习小组有5个人,每人有三门课程的考试成绩。 求出整组科目的平均分和各科目的总平均分。
——张望李赵舟
数学 80 61 59 85 76
C 75 65 63 87 77
92 71 70 90 85
可以设置一个二维数组a[5][3]来存放5个人3门课程的成绩。 然后设置一个一维数组v[3]来存储得到的各科平均分,变量设置为全组各科平均分之和。 编程如下:
程序中首先使用了双循环。 在内循环中,依次读取某门课程的每个学生的成绩,并将这些成绩相加,然后退出内循环,将累加成绩除以5送入v[i],这就是课程平均分。 外层循环共循环三次,分别计算三门课程的平均成绩,存入v数组。 退出外循环后,将v[0]、v[1]、v[2]相加除以3,得到各科目的总平均分。 最后根据题意输出每一个结果。
二维数组的初始化
二维数组初始化也是在类型声明时为每个下标变量赋初值。 二维数组可以按行赋值,也可以按行连续赋值。
例如,对于数组 a[5][3]:
线段赋值可以写成:
按行连续赋值可以写成:
这两个初值的结果是完全一样的。
【例2】求各科的并列分和总分的平均分。
二维数组的初始化赋值也有如下说明:
1)只能给部分元素赋初值,没有赋初值的元素自动取值为0。例如:
就是给每一行的第一列元素赋值,未赋值的元素取值为0。赋值后每个元素的值为:
1 0 0
2 0 0
3 0 0
赋值后的元素值为:
0 1 0
0 0 2
3 0 0
2)如果给所有元素赋初值,可以不给第一维的长度。 例如:
可以写成:
3)数组是一种结构化的数据类型。 二维数组可以看作是由一维数组嵌套而成的。 假设一个一维数组的每个元素都是另一个数组,就构成了一个二维数组。 当然,前提是元素类型必须相同。 根据这样的分析,一个二维数组也可以分解为多个一维数组。 C 语言允许这种分解。
例如,二维数组a[3][4]可以分解为三个一维数组,数组名分别为:
这三个一维数组不用多说就可以使用。 这三个一维数组有4个元素,例如:一维数组a[0]的元素分别是a[0][0],a[0][1],a[0][2], [0][3]。 必须强调的是,a[0]、a[1]、a[2]不能作为下标变量,它们是数组名,不是简单的下标变量。