【连载】(关于多维数组的简单谈论)——乐创DIY C语言讲义——5.5节

5.5 多维数组
前面的内容,都是基于一维数组讲述的。然而有些场合,一维数组无法满足我们的使用。比如,存储一个学校学生的考试成绩,那我们在设计这个存储变量类型的时候,需要考虑,假设这个学校有6个年级,每个年级有12个班级,每个班级有40名学生,那么应该如何设计一个数组,将这些学生的成绩记录下来呢?基于我们之前学习的一维数组,明显是无法用来存储这些学生的成绩的,因为如果你定义一个一维数组满足存放这个学校6个年级,那么剩余的每个年级12个班级和每个班级40个学生,这两种类型的变量放在哪里?
要解决上面的问题,当然,我们可以先计算出这个学生的总学生数6*12*40=2880个学生,然后定义一个2880长度的一维数组,将这些学生的成绩存储下来也是没有问题的,检索的时候,已知需要查询二年级3班学号为20号的同学的成绩,只需要检索到数组中下标为12*40+(3-1)*40+20-1=579的元素即可查询到他的成绩。那么学生成绩的编排应该如图5-5-1所示。
图5-5-1 一维数组存放学生成绩
图5-5-1中的方法,虽然可以很好地解决学生成绩存放的问题,但是它终究是按照一个维度的信息去设计的变量存储类型,这个维度就是学校里面所有同学的成绩。然而在我们需要快速地获取到某年级某班某同学成绩的时候,显得不是很直观,因为需要我们自己去计算出这个学生的存储下标。这里再来看下“某年级某班某同学成绩”这个表述,这个表述中蕴含了三个不同角度的信息,即年级,班级,学号,而这三个不同角度,我们称之为“维度”。C语言中提供了一种数组的应用方法,来实现这种多维度信息的存储,这种允许用户定义多维度信息的数组就是“多维数组”。其定义方法为:
数据类型数组名[维度1长度] [维度2长度] ……[维度n长度];
关于数组维度能最多定义多少个,这个理论上来说,只要内存足够多,其维度就可以一直定义下去。多维数组定义好之后,在内存上的存储如图5-5-2所示。
图5-5-2 多维数组存放学生成绩
看到这里你就可能会怀疑我是否把图片粘贴错误了,我这里再确认一遍是没有粘贴错误的,有些书上可能会把这个多维数组用阵列的形式一行一行分开来写,但是那样做明显是不符合计算机实际存储的。事实上,无论是多维数组还是一位数组,只要它们的最大长度相同,那么其存储方式都是一样的。比如看下面三个数组:
intmatrix1[24];
intmatrix2[4][6];
intmatrix3[2][3][4];
由于4*6=24,2*3*4=24,因此数组matrix1,matrix2的存储方式和matrix3一样。关于这个论点我们后面来验证。
接下来,看一下多维数组如何初始化,比如定义了一个二维数组int squre[2][3],那么初始化的时候只需要“int squre[2][3] = {{0,0,0},{0,0,0}};”,用一张逻辑上的存储图表示,如图5-5-3所示。
图5-5-3 二维数组的逻辑排列
还是需要再次强调的是,图5-5-3中所表示的只是二维数组的逻辑结构,其真正的存储方式如图5-5-4所示。
图5-5-4 二维数组在内存中的排列
那我们在对这个二维数组赋予初始值的时候,就可以使用之前学习的for循环对其进行赋值了,我们定义的这个二维数组它一个维度是2,另一个维度是3,那么我们需要用两个for语句对其进行初始化,初始化的思路是第一次大循环先确定第一个维度,然后对第二个维度进行遍历赋值,第二次大循环则改变之前的第一个维度,然后对第二个维度进行遍历赋值,那么可以写出如图5-5-5的程序。在图5-5-5中,我们先对二维数组进行遍历赋值,然后在对其进行遍历打印到终端。
图5-5-5 二维数组初始化
数组的使用有很多内容由于没有学习指针所以无法说下去了,下一章开始,我们将学习C语言中最重要的一部分,即指针操作,还会结合指针重新对数组有一个更全面的讲述。
(0)

相关推荐