《同一类型多个元素的集合-简单数组.ppt》由会员分享,可在线阅读,更多相关《同一类型多个元素的集合-简单数组.ppt(18页珍藏版)》请在三一办公上搜索。
1、第11章 同一类型多个元素的集合简单数组,在实际的程序设计和代码编写中,经常会用到大批同类型的数据,比如某个班学生的成绩等,为方便解决这类问题,C语言提供了数组这一数据结构,这里的数据结构,可理解为数据的存放和管理方式。和普通变量一样,在使用数组前必须先对其声明以开辟所需要的内存空间,由于数组是很多数据的集合,这些数据对应的内存单元是如何排列的,这都是本章要解决的内容。,11.1 什么是数组,程序经常使用同类型的数据,比如要处理某个班级的学生成绩信息,如果只有几个学生,我们可以使用几个同类型变量,比如:int mark0,mark1,mark2,mark3,mark4;这样,便可以存放5个学生
2、的成绩,但如果是几百人呢?要一直这么写下去么,如果读者觉得继续写下去没什么不妥的话,那几千甚至几万人呢,所以,如何合理组织大量同类数据是个问题。合理组织的含义包括:(1)为每个数据分配存储空间。(2)每个数据应当有唯一的标识符进行读写和查找。在这种应用背景下,数组应用而生,成功地解决了上述问题。,11.1.1 数组是一大片连续内存空间,声明一个数组时,编译器为数组分配内存存储空间,值得注意的是:数组占据的内存空间是连续的,这样,很容易计算数组占据的内存大小和每个元素对应的内存首地址,举例来说,对一个大小为N,类型为short的数组,其占据的内存大小为:N*sizeof(short)=N*2如果
3、说第1个元素在内存中的地址为p,那么第M个元素(M不大于N)在内存中的地址可表示为:p+(M-1)*sizeof(short)这充分体现了数组的有序性。,11.1.2 数组元素的访问,下面来看要解决的第2个问题“每个数据应当有唯一的标识符进行读写和查找”,这是通过下标来实现的,以一维数组为例,元素的访问形式为:数组名下标举例来说,有一个数组,名为mark,里面记录着全班60个人的成绩,mark中的第1个元素可写为mark0,第2个元素为mark1,第3个元素为mark2,由此类推,第60个元素为mark59,好了,结束。这点很重要,记住,mark60是没有意义的,对一个大小为N的数组来说,有效
4、的下标为0到N-1,不在此范围的下标访问都会引发越界错误。了解了数组的基本组织形式,下面的章节具体看下如何使用数组解决实际问题。,11.2 一维数组,一维数组也称向量,用以组织具有一维顺序关系的一组同类型数据,在使用数组前,必须先声明数组,编译器根据声明语句为其分配内存,这样数组才有意义。,11.2.1 一维数组的声明,要在内存中开辟一块连续内存给数组用,需要考虑以下问题,一是在哪里开辟,而是开辟多大的地方,C语言中,这都是由编译器自动完成的,编程人员说要做的是“提要求”,即所开辟的数组应能盛放多少个元素,每个元素是什么类型,另外,编程人员还要指定数组名。一维数组声明的基本格式为:类型 数组名
5、数组元素个数;比如,声明语句:double sz6;告诉编译器3条信息:数组名是sz,存放的元素是double型,数组存放的元素个数为6,这样,便可以对数组及数组元素进行读写访问。,11.2.2 一维数组元素的访问,上节中也已经提过,要防止下标越界的错误发生,对上面声明的数组sz来说,有效的下标是0到5,在程序中如果出现了sz6,编译器有时并不会报错,但这可能引起程序的崩溃。通过实例来看一下一维数组元素的访问方式,见。,11.2.3 数组的初始化,存在潜在的安全隐患:没有对数组元素初始化,因为立即采用键盘输入为数组元素赋了值,貌似问题不大,但如果需要对代码修改,不小心在赋值前便使用了数组元素,
6、这时,因为初始化时内存单元内容的不确定,程序输出的结果往往是不可预料的。不仅仅是数组,在声明创建一个变量后马上对其初始化是个良好的习惯,能有效减少各种意想不到的错误。可以在创建数组的同时使用初始化表达式为其中元素初始化,初始化表达式按元素的顺序依次写在一对花括号中,元素中间用逗号隔开,见示例。,11.2.4 不合法的数组操作,数组对应着一片内存区域,从较高层次上看,数组可以看成是一个特殊的大“变量”,已经学过,同类型的变量之间可以相互赋值,可以比较大小,可以作运算,那数组可否进行这些操作呢,答案是否,即使是同类型、同样大小的数组,下列操作也是非法的:(1)用一个已经初始化的数组对另一个数组赋值
7、,即使是元素类型相同,数组大小相同,这样的用法也是不允许的。int x3=7,8,9;int y3;y=x;/*错误*/(2)对数组进行整体输入输出。printf和scanf不支持对普通数组进行整体输入输出,必须以元素为单位进行操作,但对字符数组来说,可以通过“%s”进行整体输入或输出,这部分内容安排在第15章介绍。(3)数组比较。int x3=1,2,3;int y3=4,5,6;if(x y)/*错误*/(4)数组整体运算。int x5=5,6,7,8,9;int y5=2,3,4,5,6;x+=y;/*错误,其他运算与此同*/,11.3 二维数组,一维数组常称为向量,本节介绍二维数组,所
8、谓二维数组,最简单的理解是“有两个下标”,如果把一维数组理解为一行数据,那么,二维数组可形象地表示为行列结构,如所表示,左侧表示的是一个大小为M+1的一维数组,右侧表示的是一个大小为(M+1)*(N+1)的二维数组。,11.3.1 二维数组的声明,和一维数组一样,声明二维数组时,要告诉编译器以下信息:数组名,元素类型,元素的个数,对二维数组来说,元素个数是两维大小的乘积。一个二维数组可以用下列语句来声明:int sz23;这声明了一个23的二维数组,共有2行3列计6个元素,对二维数组来说,元素下标的编号仍旧是从0开始的,所以,对上面这个二维数组来说,这6个元素分别为:sz00、sz01、sz0
9、2、sz10、sz11、sz12注意:对二维数组,甚至是后面要介绍的多维数组,都要注意不要出现下标越界错误。,11.3.2 二维数组的初始化,二维数组同样可以在声明时利用初始化表进行元素的初始化,举例来说:int num23=1,2,3,4,5,6;二维数组同样可对部分元素进行初始化,如:int num23=1,2;说明:初始化表达式中内层花括号代表一行,这样,和一维数组中只能对前几个元素初始化不同,二维数组的初始化可跳过某些中间元素,给后面的元素赋值,在了解了二维数组内存分布后,理解可能更深刻。上述语句声明了一个2行3列的数组,只对每行的第1个元素进行了初始化,其他元素默认初始化为0,即上式
10、等价于:int num23=1,0,0,2,0,0;将一个二维数组中全部元素初始化为0的最简单的方式是:int num23=0;当声明语句中提供有全部元素的初始值时,第1维的大小可以缺省,如:int sz 4=1,2,3,4,5,6,7,8,9,10,11,12;,11.3.3 二维数组应用举例,一维数组中讲到,可使用“数组名下标”的形式对数组元素进行读写访问,二维数组同样如此,只是在读写访问元素时需要两个下标,即采用“数组名下标1下标2”的形式。重申:注意下标的有效范围,不要犯下标越界的错误。来看一段示例,演示二维数组的使用方式:,11.4 更高维的数组,在了解二维数组的声明、初始化和引用之
11、后,不难将概念引申到三维、四维,甚至是更高维的数组,本章讨论更高维数组的使用方式。,11.4.1 高维数组的声明和元素访问,细心的读者不难发现,如果数组是N维,就需要N个下标来访问数组中的元素,同理,在声明高维数组时,除了和一维、二维数组声明一样要制定元素类型和数组名外,还要指定每一维的大小,以帮助编译器确定到底要分配多大的内存块。举例来说,要声明一个int型3维数组sz,大小为3*4*5,代码如下:int sz345;,11.4.2 初始化,在声明一个多维数组时,同样可通过初始化表达式对其中的元素初始化,还记得二维数组中初始化表达式中的花括号么?使用花括号带来的好处是“层次分明”,举例来说:
12、int sz232=1,2,3,4,5,6,7,8,9,10,11,12;(1)多层花括号的意义,11.4.3 多维数组在内存中是如何排列元素的,维数决定了数组中元素的组织方式及访问元素说用的下标个数,但本质上讲,所有的数组在内存中都是一维线性的,所有元素都是连续排列的,中间没有间隔。以二维数组为例,内存中是先放第1行的元素,再放第2行的元素,依次类推,下面给出了大小为34的二维数组A的排列顺序:A00-A01-A02-A03-A10-A11-A12-A13-A20-A21-A22-A23多维数组的存储方式与此类似,可以将下标看成是一个计数器,像计数的万位、千位、百位、十位和个位一样,右边的下
13、标(靠后的下标)是低位,每一位都在上下界间变化,变化的范围是0到声明时指定的下标值减1,当某一低位计数器超出范围时(达到声明时指定的下标值),左边下标加1,同时该低位计数器及其右边的更低位计算器置0(回到下界)。这样,最左边一维下标变化是最慢的,最右一维下标变化最快。,11.5 小结,本章讨论了数组的基本知识,首先介绍了数组的一般概念,而后从一维数组讲起,逐渐拓展到二维甚至三维等更高维的数组。在使用一个数组之前,必须对其进行声明,编译器根据声明语句为数组分配内存空间,这样,数组才有了实际意义,才能对数组元素进行读取操作。本章依托实例阐明了数组的声明方式,不论是数组还是普通变量,声明之处、使用之前对其进行初始化是十分重要的,否则,随机的内存值可能会给程序带来这样那样的问题。数组元素在内存中是连续排列的,对二维和更高维的方式,数组元素仍然是线性连续排列的,不同下标的关系类似于数字的不同位数,最左边的下标变换最慢,最右边的下标变化最快,理解数组的内存模型有利于写出高质量的代码。,
链接地址:https://www.31ppt.com/p-5944915.html