首页 理论教育 C语言程序设计:二维数组,初始化和操作示例

C语言程序设计:二维数组,初始化和操作示例

时间:2023-10-27 理论教育 版权反馈
【摘要】:本任务只介绍二维数组,多维数组可由二维数组类推而得到。在C语言中,二维数组是按行排列的。例4.5二维数组下标的意义,运行结果如图4.7所示。图4.7例4.5 程序运行结果二维数组的初始化二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。二维数组可以看作由一维数组的嵌套而构成的。例4.7将一个二维数组a 的行和列元素互换,存到另一个二维数组b 中,运行结果如图4.9所示。

C语言程序设计:二维数组,初始化和操作示例

任务描述

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此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 个数组元素所组成的一维数组的数组名。注意此知识点将会在后期指针部分使用到。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈