




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章一维数组的应用,8.1了解一维数组8.2一维数组的简单应用8.3利用地址和指针访问数组元素8.4与一维数组有关的参数传递8.5一维数组操作中的常用算法介绍,8.1了解一维数组,8.1.1一维数组的用途8.1.2一维数组的定义在C语言中,数组必须先定义才可以使用。当定义数组时,要传递给编译器两方面的信息:数组共有多少个元素?每个元素占多少个字节?,根据以上信息,编译器决定分配多大的存储空间给该数组使用。例如:inta10;这里a是数组的名称,方括号中的10表明数组一共有10个元素,下标应该从0开始到9结束;类型名int限定数组a的每个元素中只能存放整型数。根据这一定义,系统将为数组a开辟能容纳10个整型数的连续存储单元。,一维数组定义语句的语法形式为:类型名数组名常量表达式,;说明(1)“类型名”决定了数组中可以存放的数据的类型。(2)“数组名”和变量名相同,必须遵循标识符的命名规则。,(3)“常量表达式”代表的是数组元素的个数,也就是数组的长度。它必须是无符号整型常量,不允许是0、负数和浮点数,也不允许是变量。(4)C语言中规定:每个数组第一个元素的下标固定为0,称为下标的下界;最后一个元素的下标为元素个数减1,称为下标的上界。,(5)数组的定义可以和普通变量的定义出现在同一个定义语句中。例如:floatk,x5,y20;以上语句在定义单精度变量k的同时,定义了两个单精度型的一维数组x和y。数组x共有5个元素,下标的使用范围是04;数组y共有20个元素,下标的使用范围是019。,8.1.3一维数组元素的引用数组一经建立,在内存中就占据着一串连续的存储单元。8.1.4一维数组的初始化,8.2一维数组的简单应用,例8.1编写程序,在数组x中存储自然数120,然后按以下要求输出数据:按逆序分两行输出元素值。在一行上输出所有下标为偶数的数组元素。在一行上输出所有值为偶数的数组元素。问题分析,本例题涉及的是对数组元素进行操作的基本算法。对一维数组各元素的访问,通常是在单重循环中实现。通过循环变量与循环体内语句的配合,可以灵活地、有选择地访问指定元素。读者在阅读以下程序时,应理解数组元素下标与数组元素值的区别;掌握如何用循环变量控制数组元素的下标;以及如何在连续输出的过程中控制输出换行。,源程序如下:main()intx20,i;for(i=0;i=0;i)/*控制从数组尾部开始输出*/,printf(%3d,xi);if(i%10=0)printf(n);/*控制每输出10个元素后换行*/printf(输出下标为偶数的元素:n);for(i=2;i20;i+=2)printf(%3d,xi);printf(n);,printf(输出值为偶数的元素:n);for(i=0;i20;i+)if(xi%2=0)printf(%3d,xi);printf(n);,程序的运行结果如下:分两行逆序输出:2019181716151413121110987654321输出下标为偶数的元素:35791113151719输出值为偶数的元素:2468101214161820,8.3利用地址和指针访问数组元素,8.3.1数组名、元素地址及指针的关系通过前面的知识积累和本节的进一步介绍,读者应该建立起如下概念。(1)数组是一种构造数据类型。数组名代表着这个数组所占连续存储空间的起始地址。,这个地址是在定义数组时由系统所分配的,不可以人为改变。因此,可以认为数组名是一个地址常量。如有定义:intx5,y5,m=3;则语句:x=,都是错误的。数组名x和y作为地址常量可以使用,不可以重新赋值。而表达式:x+1、y+2则是合法的。它们表示以数组名为首地址增加一个偏移量后的地址值。,(2)就整体而言,每个数组元素都是数组这个集合中的一分子,由于数组所占地址空间是连续的,通过数组名这个首地址就可以找到数组中的所有元素;就个体而言,每个数组元素都可以看作是一个带下标的变量,它完全可以像普通变量一样进行求地址运算。因此,用数组名表示的地址与数组元素的地址之间就有如下关系:x+1等价于则语句:p=a;等价于p=,都使指针变量p中存放了数组a的首地址,即p指向了数组a的第一个元素a0。在这一前提下,表达式:*p等价于*a都代表数组的第一个元素a0。而:*(p+2)等价于*(a+2)都代表数组的第三个元素a2。,语句:p+;表示将指针p移动一个位置,指向数组a的第二个元素a1。但语句:a+;则是非法的,因为a是常量。,由此可见:数组名是地址常量;指针是存放地址的变量,它们都可以用来描述数组元素的地址,进而可以得到元素的内容。所以,我们不仅可以直接用带下标的变量形式来访问数组元素,还可以通过数组的首地址(数组名)和指针来访问数组元素,从而大大地增加了数组使用的灵活性,但也同时增加了初学者全面掌握C语言的难度。,8.3.2通过数组首地址访问数组元素设有如下定义:intx10,i;通过上一节的叙述已知:数组名是数组的首地址,从而有:,x+0等价于i10;i+)scanf(%d,x+i);for(i=0;i10;i+)printf(%3d,*(x+i);注意:在上面的程序段中,我们只是使用了代表数组首地址的数组名x,并没有(也不允许)改变它的值。,8.3.3通过指针访问数组元素通过地址常量数组名可以访问数组元素,显然,通过存放地址的变量指针也可以访问数组元素,而且更具灵活性。若有如下定义:intx10,*p,i;在执行了语句:p=x;或p=后,指针p中存放的是数组x的首地址。,如果不移动指针,也可以采用首地址+位移量的形式逐个输入输出数组元素:p=x;for(i=0;i10;i+)scanf(%d,p+i);for(i=0;i10;i+)printf(%3d,*(p+i);,在上一小节的讨论中,我们曾经得出结论:*(x+i)等价于xi。细心的读者可能会问:在这里*(p+i)是否也等价于pi呢?确实如此。事实上方括号也是一种运算符。概括起来,如果有如下定义和语句:intx10,*p,i;p=x;,则表示数组x中的元素可以有以下四种形式:xi*(x+i)*(p+i)pi当然,这里的i必须满足条件:0i10,否则下标就越界了。与数组名不同,指针是变量,它可以通过赋值语句移动位置。因此可以采用以下方法,通过顺序移动指针来逐个输入输出数组元素:,p=x;for(i=0;i10;i+)scanf(%d,p);p+;p=x;for(i=0;i10;i+)printf(%3d,*p);p+;注意:由于在输入时移动了指针,输出前还应通过赋值操作使指针再次指向数组的第一个元素。,8.4与一维数组有关的参数传递,8.4.1数组元素作实参数组元素就是带下标的变量。所以,数组元素作实参与简单变量作实参一样,对应的形参应该是同类型的简单变量。,例8.3编写程序:利用随机函数产生6个50以内的整数存入数组a中,然后调用自定义函数isodd依次判断数组a中的元素是否为奇数。程序如下#includestdlib.hintisodd(intx)/*形参是与实参相同类型的普通变量x*/if(x%2=1)return1;elsereturn0;,main()inta6,i;for(i=0;i6;i+)ai=rand()%50;printf(%4d,ai);printf(n);,for(i=0;i6;i+)if(isodd(ai)/*数组元素ai作实参*/printf(a%disodd.n,i);elseprintf(a%disnotodd.n,i);,运行结果如下:46303240617a0isnotodd.a1isnotodd.a2isnotodd.a3isnotodd.a4isnotodd.a5isodd.,8.4.2数组名作实参数组名作为实参传递时,传送给形参的是数组的首地址。因此,对应的形参必须是基类型相同的指针变量。例8.4编写程序:利用自定义函数ArrIn和ArrOut实现数组元素的输入和输出。,源程序如下:#defineN100voidArrIn(int*x,intn)/*对应的形参x是指针变量*/inti;for(i=0;in;i+)scanf(%d,x+i);,voidArrOut(int*x,intn)inti;for(i=0;in;i+)printf(%4d,*(x+i);if(i+1)%5=0)printf(n);/*控制输出5个元素后换行*/,main()intaN;ArrIn(a,20);/*数组名a作实参*/ArrOut(a,10);,主函数中调用ArrIn和ArrOut函数时,都将数组名a作为实参传递给了形参指针x,使x得到了主函数中所定义的数组a的首地址,仍旧遵循了“按值”传递这惟一的参数传递原则。接下来,在自定义函数中,通过指针x所操作的就是主函数中的数组a。,另外,在主函数中定义的数组a一共可以容纳100个整数,但在调用ArrIn函数时,将常量20传给了形参n,因此只给数组的前20个元素输入了数据。调用ArrOut函数时,则只输出了数组a的前10个元素。,需要说明的是:当数组名作为实参时,对应的形参应该是指针,但还允许其他表示形式。以ArrIn函数为例,对于调用语句:ArrIn(a,20);,相应的函数首部允许是以下三种形式:voidArrIn(int*x,intn)voidArrIn(intx,intn)voidArrIn(intxN,intn)无论表示形式如何,C编译器都将x按指针处理。,8.4.3数组元素的地址作实参数组元素的地址作实参,与数组名作实参一样,传递的也是地址值,所以对应的形参也应当是基类型相同的指针变量。但这种方式带给了程序设计者更大的灵活度。我们在不改变例题8.4中自定义函数的前提下,通过传递数组元素的地址,可以实现对主函数中数组a的任意一段连续空间中数组元素的输入和输出。,例如:#defineN100voidArrIn(int*x,intn)inti;for(i=0;in;i+)scanf(%d,x+i);,main()intaN;ArrIn(/*调用函数为a50a54输入数据*/,结合主函数中的调用语句ArrIn(可以看出:(1)第1个实参&a10是数组元素a10的地址,将它对应传给函数ArrIn中的形参x,使x指向了数组元素a10,用来控制输入数据时存放的起始地址;,(2)第2个实参10对应传递给了函数ArrIn的形参n,用来控制为10个元素输入数据;(3)在函数ArrIn中,由于指针变量x初始指向的是数组元素a10,所以当i=0时,scanf语句中的x+0就是a10的地址;当i=1时,scanf语句中的x+1就是a11的地址;从而实现为a10a19这10个元素输入数据的目的。,8.5一维数组操作中的常用算法介绍,8.5.1查找查找是数据处理中最基本且重要的操作之一。最常用的算法有“找最大(小)值”、“顺序查找”指定值和“二分法查找”指定值等。,8.5.2插入插入是数组的基本操作之一。在实际应用中,有时要求“在某一数值前(或后)插入一个元素”;有时则需要“在有序表中插入一个元素,插入后仍保持表有序”。不论是哪一种情况,都首先要找到应插入的位置,这一操作可通过前面介绍的查找算法实现。因此,插入操作的关键应该是如何实现“在指定位置上插入一个元
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度电商平台运营团队入职培训合同范本
- 二零二五年度光纤宽带接入与宽带提速服务合同
- 二零二五年度国际广告宣传代理合同
- 2025版建筑渣土运输与污水处理服务合同范本
- 二零二五版美容院员工培训与技术交流合同
- 二零二五版海外房地产项目劳务派遣劳动合同
- 2025版咖啡厅租赁合同书(含人力资源管理与培训)
- 2025电商产品研发与运营合作协议书0814
- 2025版房地产广告代理服务与技术支持合作协议
- 二零二五年度返聘研发人员知识产权保护合同
- 腮红画法教学课件
- 二零二五版便利店员工劳动合同模板
- 弱电设备运输方案模板(3篇)
- 2025-2030中国重水市场运行态势与未来竞争力剖析报告
- 企业职工感恩教育
- GB 17051-2025二次供水设施卫生规范
- 品牌管理部组织架构及岗位职责
- 临沧市市级机关遴选真题2024
- 【物化生 高考西北卷】2025年高考招生考试真题物理+化学+生物试卷(适用陕西、山西、青海、宁夏四省)
- 2025-2030中国工控机(IPC)行业应用态势与前景动态预测报告
- 人员出差审批管理制度
评论
0/150
提交评论