第七章 一维数组 - 白底黑字_第1页
第七章 一维数组 - 白底黑字_第2页
第七章 一维数组 - 白底黑字_第3页
第七章 一维数组 - 白底黑字_第4页
第七章 一维数组 - 白底黑字_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 一维数组 新视野教育 一、引入 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 前面的章节我们介绍了C语言中的所有基本数据类型, 如int、float、char等,我们讲过的数据类型,除基本 类型外,还有构造类型,指针类型和空类型。本章我们 将讨论C语言中最简单的构造类型数组。数组是一 组具有相同类型的数据的有序集合,这些数据称为数组 元素。数组元素在内存中占据连续的存储空间。同一数 组中的元素的类型相同,元素的名字包含相同的数组名 和不同的下标。根据数组中元素具有下标的个数可以把 数组分为一维数组、二维数组和多维数组。接下来我们 就先来看一维数组。 二、一维数组的基本概念 一

2、维数组的定义:数组元素只有一个下标的数组称为一维数组。 一维数组定义形式如下: 类型说明符 数组名常量表达式 在后面加上“;”就构成了一条定义语句。例如: int a5; 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 说明: (1)“类型说明符”说明了数组中元素的类型,可以是基本的数据类型, 也可以是构造就定义了一个一维数组,数组名为a,包含5个int类型元素。 每个元素只有一个下标,下标是各个元素的顺序编号。类型,它告诉编译 器数组中每个元素占用了多少字节的存储空间。 (2)数组名是数组的名称,它的命名规则与变量名相同,必须遵循用户定 义标识符的命名规则。 (3)数组名后面的一对方

3、括号必不可少,方括号内的表达式必须为常量表 达式,表示数组元素的个数,也称为数组的长度。该常量表达式的值必须 为正的整型常量,绝对不能为变量。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 (4)方括号中的5规定了a数组有5个元素,分别是a0、a1、 a2、a3和a4。 (5)每个数组只能有一个下标,数组的下标总是从0开始,到数 组长度减1结束。 (6)定义之后,a数组在内存中占用5个连续的存储单元,每个单 元可以存放一个整型数据,占用4字节的内存空间,如图所示。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 a0a1a2a3a4 例 下列选项中,能够正确定义数组的语句是【

4、2010年3月份试题】 A)int num0.2008; B) int num; C) int N=2008; D) #define N 2008 int numN; int numN; 分析:本题考察点在“一维数组的定义形式中数组长度必须为常量, 且常量表达式的值必须为正的整型常量,绝对不能为变量”。A选 项方括号中不是整型常量,B选项在定义数组时,数组中元素个数 必须给定,C选项中N是变量,不是常量表达式,错误。本题答案 选择D。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 2.一维数组元素的引用 C语言规定,不能一次引用整个数组,只能逐个引用数组元素。 引用一维数组元素的一般

5、形式如下: 数组名下标表达式 数组名后的一对方括号不可缺少,下标表达式可以是由整型的 常量和变量构成的表达式。例如有以下定义: int a10; 则a0,a1,a2,a9都是对a数组中元素的合法引用。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 说明: (1) 数组中的元素其实就是一个变量,占用一个存储单元。如数 组a中的变量就是普通的int类型的变量。对该类型的变量的一切 合法操作对于数组元素来说都是正确的,如: a0=5; a0+; a1=a0+14; printf(%d,a4); 都是正确的。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 (2) 引用数组元素时,下

6、标表达式的值的上限为定义时的常量表 达式减1,下限为0。在引用时要保证下标不能超过定义时的常 量表达式减1,即下标不能越界。如在定义了int a10;之后,下 标不能超过9,例如a10这样的引用是不合法的。 (3) 数组是一个构造类型,是集合的概念。但是不能整体引用数 组里面的所有的元素。企图简单地通过数组名a整体代表其中的 10个int类型的变量是不行的。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例2 对一维数组元素的引用。 #include main( ) int a4; a0=0; a1=1; a2=2; a3=3; printf(”%d %d %d %d ”, a0,a

7、1,a2,a3 ); 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例3 请编写一个程序,通过键盘输入10个数,并输出这些数中 的最大值和最小值。【2011年3月份试题】 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 main( ) int i, max, min, a10; for(i=0;i10;i+) scanf(%d, max=a0; min=a0; for(i=1;i10;i+) if(maxai) min=ai; printf(max=%d min=%d,max,min); 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例4 有以下程序【2009年9月

8、份试题】 #include stdlib.h main( ) int i,a,b10; for(i=0;i10;i+) bi=rand(20); printf(%d,bi); for(i=0;i5;i+) a=bi; bi=b10-1-i; b10-1-i=a; for(i=0;i10;i+) printf(%d,bi); 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 3、一维数组的初始化 (1) 在定义语句中把各个元素的初值依次放在赋值号后面的一对花括号中, 以“,”间隔。如: int a5=10,20,30,40,50; 系统按照顺序一一存放:将整型常量10赋值给数组a中的第一个

9、元素a0; 将整型常量20赋值给数组a中的第二个元素a1,。注意,在初始化的时 候,无法跳过前面的元素而对后面的元素赋值。 (2) 所赋初值的个数可以少于数组元素的个数。如: int a5=1,2; 系统同样按照顺序存放。只是仅仅对第一个元素和第二个元素赋值,后面未 赋初值的元素系统默认为0。这样数组a中后3个元素的值全都为0。 (3) 可以不写方括号中的常量表达式而通过初始化来确定数组中元素的个数。 如: int a=10,20,30,40,50; 该语句隐含地表达了数组a包含5个元素,与(1)中初始化完全等同。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 注意: (1) 当指定

10、了数组长度的时候,不允许赋初值的个数多于数组中 元素的个数。如: int a5=10,20,30,40,50,60; 就是错误的。 (2) 所赋初值的类型必须与数组元素的类型一致。 (3) 在单纯的定义语句中,不能出现省略数组长度的情况。如int a;是错误的。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例6 有以下程序 main( ) int i; float sum, aver, b10=4,2,8,3,1,10,5,6,12,7; sum=0; for(i=0;i10;i+) sum+=bi; aver=sum / 10; printf(sum=%f aver=%f,sum

11、,aver); 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 习题 1以下能正确定义一维数组的选项是( )。 A)int a5=0,1,2,3,4,5; B)char a = 0,1,2,3,4,5; C) char a= A,B,C; D)int a5=”0123”; 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 2有以下程序 #include main() int s12=1,2,3,4,4,3,2,1,1,1,2,3,c5=0,i; for(i=0;i12;i+) csi+; for(i=1;i5;i+) printf(%d,ci); printf(n); 程序的运行

12、结果是 A)1 2 3 4 B)2 3 4 4 C)4 3 3 2 D)1 1 2 3 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 3.有以下程序 #include main() int a5=1,2,3,4,5, b5=0,2,1,3,0,is=0 for(i=0;i5;i+) s=s+abi; printf(%dn,s); 程序运行后的输出结果是 A) 6 B) 10 C) 11 D)15 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 三、一维数组与指针 1.一维数组首地址和数组元素的地址 在C语言中,数组占用一串连续的存储单元,如图7-2所示。如有以下定义: int

13、 a5, *p, i; 数组中每个元素都可以看作是一个变量,因此每个数组元素均有一个地址, 例如元素a0的地址可表示为或a+; 这样的赋值 语句都是非法的。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 2、通过指针引用一维数组元素 在上一节,我们使用一对方括号引用数组元素,例如a0表示a数组的第一 个元素。本节我们学习使用指针来引用数组元素。 (1)通过指针引用数组元素,如有以下的定义语句: int *p, a5; p= 指针变量p指向了数组元素a0,因此可以使用间接访问运算符“*”来引 用变量a0。如: *p=18; 是对p指向的存储空间,即a0赋值为18,它等价于: a0=18

14、; 在指针一章我们学过,可以通过算术运算对指针进行移动。例如p+1表示p 所指向存储单元的下一个存储单元,即a1;p+2指向a2,p+3指向 a3,所以我们可以使用*(p+1)来表示a1,*(p+2)来表示a2, 同样,也可以使用p表示 for(p=a,i=0;i5;i+) scanf(%d,p+i); for(p=a;pa+5;p+) printf(%d,*p); 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 (2)通过数组的首地址引用数组元素,如有定义: int a5; 由于a表示数组a的首地址,我们可以把a当作一个指针常量。 因此*a等价于a0,*(a+1)等价于a1,同样,a

15、等价于 for(i=0;i5;i+) scanf(%d,a+i); for(i=0;i5;i+) printf(%d,*(a+i); 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 (3)用带下标的指针变量引用一维数组元素,如有以下定义语 句: int *p,a5;p=a; 我们可以使用p0来表示p指针指向的内存单元,使用p1表示p 指针指向的内存单元的下一个内存单元。也就是说,可以使用 p0来表示a0,p1来表示a1。 因此,对数组元素ai可以有以下4种等价的引用方法: ai pi *(a+i) *(p+i) 对应的,对ai地址的引用,也有以下4种等价的引用方法: printf(%d

16、n,*p+*q); 程序运行的输出结果是 。 A)16 B)10 C)8 D)6 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例10 有以下程序 main( ) int i, s=0, t=1,2,3,4,5,6,7,8,9; for(i=0;i9;i+=2) s+=*(t+i); printf(%dn,s); 程序执行后的输出结果是 A)45 B)20 C)25 D)36 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 习题 1. 设有定义double a10,*s=a;,以下能够代表数组元素a3的 是 A)(*s)3 B)*(s+3) C)*s3 D)*s+3 2. 有

17、以下程序 main() char ch=uvwxyz,*pc; pc=ch; printf(%cn,*(pc+5); 程序运行后的输出结果是 A)z B)0 C)元素ch5 地址D)字符y的地址 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 3.有以下程序 #include void fun(char *p) +p; printf(%sn,*p); main() char *a=Morning,Afternoon,Evening,Night; fun(a); 程序的运行结果是 A)Afternoon B)fternoon C)Morning D)orning 新视野教育新视野教育一分

18、耕耘一分耕耘 一分回报一分回报 4.有以下程序 #include void fun(char *a,char *b) while(*a=*) a+; while(*b=*a) b+;a+; main() char *s=*a*b*,t80; fun(s,t); printf(“%s”,t); 程序的运行结果是 A)*a*b B)a*b C)a*b* D)ab 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 四、一维数组与函数 1、一维数组元素作实参 在调用函数时,数组元素和普通变量一样,可以作为实参传送 给形参,每个数组元素实际上代表内存中的一个存储单元,故 对应的形参必须是类型相同的

19、变量。数组元素的值可以传送给 该变量,在函数中只能对该变量进行操作,而不能直接引用对 应数组元素。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 2.一维数组名作实参 通过对一维数组的学习,我们知道一维数组的数组名代表该数组的首 地址,是一个地址常量。如果要将某个数组的所有元素传递到另外一 个函数中,不需将数组的每个元素逐一进行传递,只需将该数组元素 的首地址传递给函数即可。因此,对应的形参就应当是一个指针变量, 此指针变量的基类型必须与数组的类型一致。在函数中,可以通过此 指针变量来引用调用函数中对应的数组元素,从而达到对调用函数中 对应的数组元素进行操作。通常对应函数的首部可以有

20、以下3种格式: (1)fun(int *a) (2)fun(int a) (3)fun(int aN) 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例11 有以下程序 int fun(int *x, int n) int i,sum=0; for(i=0;in;i+) sum=sum+xi; return sum; main( ) int a=1,2,3,4,5,s=0; s=fun(a,5); printf(%dn,s); 该程序运行后的输出结果是 A) 15B) 25 C) 20 D) 10 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例11 有以下程序 int f

21、un(int *x, int n) int i,sum=0; for(i=0;in;i+) sum=sum+xi; return sum; main( ) int a=1,2,3,4,5,s=0; s=fun(a,5); printf(%dn,s); 该程序运行后的输出结果是 A) 15B) 25 C) 20 D) 10 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例11 有以下程序 int fun(int *x, int n) int i,sum=0; for(i=0;in;i+) sum=sum+xi; return sum; main( ) int a=1,2,3,4,5,s

22、=0; s=fun(a,5); printf(%dn,s); 该程序运行后的输出结果是 A) 15B) 25 C) 20 D) 10 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 3、一维数组元素地址作实参 一维数组元素的地址作为函数的实参与一维数组名作为函数的 实参有相似之处。它们都是地址值,对应的形参也应当是基类 型相同的指针变量。 新视野教育新视野教育一分耕耘一分耕耘 一分回报一分回报 例12 有以下程序 void sum(int p) p0=p-1+p1; main( ) int a10=1,2,3,4,5,6,7,8,9,10; sum( printf(%dn,a2); 程序运行后的输出结果是 。 A)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论