【连载】(关于多维数组的简单谈论)——乐创DIY C语言讲义——5.5节 2024-05-13 11:06:23 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) 相关推荐 C语言中数组的总结 #目录 # 一维数组的创建和初始化 一维数组的使用 一维数组在内存中的存储 指针的初步介绍 一维数组的指针访问 二维数组的创建和初始化 二维数组的使用 二维数组在内存中的存储 二维数组的指针访问 有关 ... Excel一维数组转二维数组的方法 excel使用技巧大全在前面我们已经讲过,读取数组中的数据都是连续的.但有时,一些数据是不连续的.这时我们应该怎么办呢? 例如,许多格式相同的sheet要合并在一起.我们想看每一个sheet的数据.此 ... C语言二维数组的定义、初始化、赋值 上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为一维数组.在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以确定它在数组中的位置.本节只介绍二维数 ... 数组运算6(方向不同的一维数组的运算) 今天来说数组运算的最后一种运算方式,方向不同的一维数组间的运算,也就是横向一维数组与纵向一维数组的运算. -01- 运算规则 如下图所示,是一维纵向数组与横向数组的连接运算.它们运算的结果是一个二维数 ... 动态内存分配连续内存空间的二维数组 可以直接使用一维数组来模拟二维数组,下面的代码就是在此基础上,用一个二级指针指向一维数组的相应地方,详见代码 #include <stdio.h> #include <malloc. ... 【连载】(函数声明和简单的Makefile文件)乐创DIY C语言讲义——4.2节 4.2 函数声明 当编译器检测到一个函数调用时,它产生代码传递参数,并且调用这个函数,等函数运行完成之后,接收到这个函数的返回值(如果函数有返回值).但是编译器是如何知道函数接收到的是什么类型和多少数 ... 【连载】(函数私有化)乐创DIY C语言讲义——4.6节 4.6 函数私有化 C语言的语句非常简单,关键词也少得可怜,关于变量和函数的修饰符也就只有区区几个,因此一个关键词有时候有着多重含义,这也就是为何C语言明明非常简单,但是用起来又非常复杂的原因之一.C ... 【连载】(堆栈和递归函数)乐创DIY C语言讲义——4.5节 4.5 堆栈和递归函数 堆栈这个概念,最早学习微机原理的时候就学过,它表示的是一种在汇编语言调用子程序时候保存现场的存储空间,它所具有的数据结构属性就是先进后出,这个是我们之前学习计算机硬件时候讲述的 ... 【连载】(学了这么多年C语言,你真的了解static关键词吗)乐创DIY C语言讲义——4.4节 4.4 变量的补充 前面内容中,我们已经讨论了变量的定义,但是由于函数的概念还没有引入,因而这是不全面的,本节开始,我们再来补充一些变量的其他内容,这就相当于对变量这个概念的重新认识. 我们之前讲的变 ... 【连载】(函数的参数和返回值)乐创DIY C语言讲义——4.3节 4.3 函数的参数和返回值 函数定义和声明好之后,整个函数也就定义好了,上一小节我们说到,声明函数原型的目的,就是将函数的信息传递给编译器"登记"下来,以便后续调用时进行参数的检查 ... 【回顾】(函数声明和简单的Makefile文件)乐创DIY C语言讲义——4.2节 4.2 函数声明 当编译器检测到一个函数调用时,它产生代码传递参数,并且调用这个函数,等函数运行完成之后,接收到这个函数的返回值(如果函数有返回值).但是编译器是如何知道函数接收到的是什么类型和多少数 ... 【连载】(函数的定义)乐创DIY C语言讲义——4.1节 4.1函数的定义 到目前为止,我们所有的程序都是以"main()"函数作为程序的唯一入口的,对main函数的解释,也就仅限于其作为整个程序的入口.但是函数的定义,入口参数,返回值等 ... 【连载】(选择执行语句if else和switch)乐创DIY C语言讲义——3.8节(4) 4 选择执行语句 有些时候,我们希望程序既不顺序执行,也不只做单一的判断(代码运行还是不运行),很多时候,我们往往只希望对某一个条件的不同状态分别执行不同的语句,这样就构成C语言中的选择执行语句了.C ... 【连载】(循环执行语句while和if)乐创DIY C语言讲义——3.8节(3) 2 循环执行语句 计算机有一个强大的能力,快速地重复执行某一计算,这种重复计算多次的方法,是通过软件中的循环执行语句去实现的.C语言中实现循环语句结构的方式有三种,第一种为"for" ... 【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2) 2 判断执行语句 判断执行语句,执行时候会有一个条件判断,一旦当条件判断为真,即True的时候,就执行相应的语句,满足条件被执行的语句用大括号"{}"括起来.由于在C语言中没有用于 ...