任务描述
前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标, 以标识它在数组中的位置,所以也称为多下标变量。本任务只介绍二维数组,多维数组可由二维数组类推而得到。
知识学习
(1)二维数组的定义
二维数组的定义形式为:
类型标识符数组名[元素个数1][元素个数2];
二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是像一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行;另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。
例如:
int a[3][4];
说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3 ×4 个,即:
按行顺次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行,每行中的4 个元素也是依次存放的。由于数组a 说明为int 类型,该类型占4 个字节的内存空间,所以每个元素均占有4 个字节(VS 2015 上运行),其存储方式如图4.6所示。
图4.6 整型二维数组a [3] [4]存储情况
多维数组的定义方式可以按照二维数组的定义:
类型标识符n 维数组名[元素个数1][元素个数2]…[元素个数n];
即n 维数组就有n 个“[元素个数]”。
多维数组的存储顺序为:最左边的下标变化最慢,越往右变化越快,最右边的下标变化最快。
(2)二维数组元素的引用
二维数组中元素的表示形式为:
数组名[下标1][下标2]
同一维数组一样,二维数组的下标可以是整型常量、整型变量或者整型表达式。为了便于理解二维数组下标的含义,可以将二维数组看作一个行列式或矩阵,则下标1 用来确定元素的行号(从0 开始,小于等于“元素个数1”减1),下标2 用来确定元素的列号(从0 开始,小于等于“元素个数2”减1)。
n 维数组中元素的表示形式为
n 维数组名[下标1][下标2]…[下标n]
其中下标的取值范围和类型同二维数组,并且n 维数组的元素同样可以赋值和出现在表达式中。
例4.5 二维数组下标的意义,运行结果如图4.7所示。
图4.7 例4.5 程序运行结果
(3)二维数组的初始化
二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。
例如:对数组a[5][3],按行分段赋值可写为:
int a[5][3] ={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
按行连续赋值可写为:
int a[5][3] ={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
这两种赋初值的结果是完全相同的。
可以只对部分元素赋初值,未赋初值的元素自动取0 值。
例如:
int a[3][3] ={{1},{2},{3}};
是对每一行的第一列元素赋值,未赋值的元素取0 值。赋值后各元素的值为:
(www.xing528.com)
赋值后的元素值为:
如对全部元素赋初值,则第一维的长度可以不给出。
例如:
int a[3][3] ={1,2,3,4,5,6,7,8,9};
可以写为:
int a[][3] ={1,2,3,4,5,6,7,8,9};
数组是一种构造类型的数据。二维数组可以看作由一维数组的嵌套而构成的。设一维数组的每个元素都是一个数组,就组成了二维数组,当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。
如二维数组a[3][4],可分解为3 个一维数组,其数组名分别为:
a[0]
a[l]
a[2]
对这三个一维数组不需另作说明即可使用。这3 个一维数组都有4 个元素,例如:一维数组a[0]的元素为a[0][0]、a[0][1]、a[0][2]、a[0][3]。
必须强调,a[0]、a[1]、a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
(4)二维数组的程序举例
例4.6 输入5 个同学3 门课的成绩,计算各门课的总分及平均分,运行结果如图4.8所示。
程序分析:
本程序利用二维数组,每一行存放一个学生成绩,即行代表学生,列代表每门课的成绩。要存放5 个学生3 门课的成绩,就要使用一个5 ×3 的二维数组。要得到每门课的总分和平均分,需要另外定义一个一维数组sum[3]和avg[3]分别来存放,具体实现步骤如下:
①输入5 个学生,每个学生3 门课的成绩,存入二维数组score 中。
②计算5 门课程的总分,存放到数组sum 中;计算出每门课程的平均分,存放到数组avg 中。
图4.8 例4.6 程序运行结果
③输出5 个学生3 门课的成绩,并输出课程的总分和平均分。
例4.7 将一个二维数组a 的行和列元素互换(即行列转置),存到另一个二维数组b 中,运行结果如图4.9所示。
图4.9 例4.7 程序运行结果
程序分析:
该程序要求将一个二维数组行和列的元素互换,即原来是第一行变成第一列,原来第二行变成第二列,所以解决方法是定义一个数组a 为两行三列,定义一个数组b 是三行两列,转换过程通过b[j][i] =a[i][j]赋值语句完成。
任务总结
在现实生活中,当遇见矩阵、表格、坐标等数据表示或者描述时,将在程序中考虑用二维数组表示。
二维数组的特点如下:
①二维数组定义时,如:int a[3][4];。
②二维数组中所有数组元素数据类型一致,不可能存在数组中出现两种或者两种以上的数据类型。
③二维数组中所有数组元素在内存中是连续存储的,意味着二维数组本质上一维数组,只是数据之间的逻辑关系可以看成二维。
④二维数组中所有数组元素的存储空间都相同。
⑤二维数组的数组名等价于该数组首元素的地址,如:int a[3][4];,则有a 等价于&a[0],但是a[0]其实是a[0][0]、a[0][1]、a[0][2]、a[0][3]4 个数组元素所组成的一维数组的数组名。注意此知识点将会在后期指针部分使用到。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。