版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章函数函数是构成C程序的基本程序单位。C语言函数分为两种:库函数和用户自定义函数。库函数是系统提供的已设计好的函数,只要指定了要调用函数所在的库文件,就可以直接调用了。用户自定义函数是用户自己编写的用来解决具体问题的函数。(1)函数的定义(2)函数参数和函数返回值(3)函数调用(4)递归调用(5)向函数传递数组(6)变量的存储属性(7)编译预处理返回7.1函数定义函数定义的一般形式为:类型符函数名(形式参数说明表)
{
说明部分语句部分
}其中:(1)“类型符”是函数的类型,即指当函数结束时所得结果的类型。当函数类型为int时,int可以省略不写;当函数不需要返回值时,可用void类型来表示它的类型。(2)“函数名”是给函数起的名字,应符合标识符的有关规定。下一页返回7.1函数定义(3)“形式参数说明表”是对形式参数的说明,它可有可无。当它省时,称该函数为无参函数,否则称有参函数。一、有参函数:“形式参数说明表”中有参数。当参数有两个以上时,参数之间要用逗号分开。二、无参函数:“形式参数说明表”中没有任何参数。三、空函数:空函数是指参数为空,函数体也为空。上一页返回7.2函数参数和函数返回值调用函数时,主调函数和被调函数之间有数据传递关系。主调函数通过参数将数据传送到被调函数,被调函数通过返回值将函数的计算结果返回到主调函数。7.2.1形式参数和实际参数在定义函数时,函数后面括号中的变量称为“形式参数”,简称“形参”。在调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参”。当函数调用时,将“实参”的值传送给“形参”变量。(1)定义函数时,形参是变量,必须指定类型。形参变量需要的存储单元是在函数被调用时才给它分配,函数结束时予以释放。(2)实参与形参在个数和类型上应一一对应。(3)实参可以是常量、变量或表达式。但变量和表达式要有确定的值。下一页返回7.2函数参数和函数返回值(4)C语言中,参数的传递是“值传递”,即单向传递。数据只能由实参传送给形参,而不由形参传回给实参。7.2.2函数返回值通常,在调用一个函数时,都希望被调函数通过计算得到一个值,这就是函数的返回值。函数的返回值是通过返回语句return实现的,返回语句的形式为:
return;或return表达式;说明:(1)如果要从被调函数带回一个值,被调函数中必须要有“return表达式”语句。函数中可以有多个return语句,执行到哪个,哪个就起作用且立即返回调用函数。上一页返回7.3函数调用(2)函数的返回值要有一个确定的类型,应该在定义函数时指定。(3)为了明确函数的返回值,可用关键字“void”定义函数。7.3.1函数调用的一般形式函数调用的一般形式为:函数名(实参表)如果是调用无参函数,则实参表可以没有,但括号不能省略。如果实参表包含多个实参,则各参数之间用逗号隔开。实参与形参的个数应相等、类型应一致。实参与形参按顺序对应,一一传递数据。下一页返回7.3函数调用7.3.2函数调用的方式按函数在程序中出现的位置来分,可以有以下两种函数调用方式:1.函数语句即把函数调用作为一个语句。这时不要求函数带回值,只要求完成一定的操作,通常将函数定义为“void”类型。2.函数表达式函数出现在可以写表达式的地方,此时需要函数的值来参加运算。7.3.3对被调函数的声明函数声明是对所用到的自定义函数的特征进行必要的声明。编译系统以函数声明中给出的信息为依据,对函数的调用进行检测,以保证函上一页下一页返回7.3函数调用数调用、参数传递正确。函数声明有以下3种格式。格式1:函数类型函数名(形参说明表);格式2:函数类型函数名(形参类型表);格式3:函数类型函数名();(1)这三种声明格式除了对形参说明有所差别外,都向编译系统通知了两个必需的信息:函数名和函数类型。(2)格式1的函数声明方式与函数定义首部一致,也称“函数原型”。在形参说明中对每一个形参变量进行了详尽的描述:形参的类型及形参名。(3)格式2是格式1的一种简化,并没有说明形参名。(4)格式3是格式1的进一步简化,但这种简化少通知了关于形参的上一页下一页返回7.3函数调用信息。(5)只要在函数调用之前进行函数声明即可。(6)函数定义包含了函数声明,即当函数定义出现在主调函数之前,可不必进行函数声明。(7)如果被调函数的函数值为int类型,也可以不必声明函数。7.3.4函数的嵌套调用一个较大的程序一般有若干个程序模块,每一个模块用来实现一个特定的功能。在C语言中,模块是由函数来完成的,函数的使用使重复编写程序的工作量大大减小。一个C程序可由一个主函数和若干个函数构成。由主函数调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。主函数不允许其他函数调上一页返回7.4递归调用用,而是由操作系统完成调用的。C语言的函数定义都是相互平行、独立的,不允许嵌套定义,但允许嵌套调用。在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。如:intfun1(intx)
{inty,z;
……z=fun1(y);
……returnz-10;}下一页返回7.4递归调用
intfun2(intx)
{inty,z;
……z=fun3(y);
……returnz-10;}intfun3(intt)
{inta,b;
……b=fun2(a);
……returna*b;}上一页下一页返回7.4递归调用在调用fun1()函数的过程中,又调用了该函数本身,这是直接递归调用,见图7.2。在调用fun2()函数过程中要调用fun3()函数,而在调用fun3()函数过程中又调用fun2()函数,这是间接地递归调用,见图7.3
。上一页返回7.5数组作函数参数函数实参可以为变量,数组元素同样是变量,也可以作函数的实参。此外,数组名也可以作函数的参数,传递整个数组。7.5.1数组元素作函数的实参数组元素作函数的实参的用法与普通变量的用法一致,是单向传递。7.5.2数组名作函数参数当数组名作参数时,传递的是整个数组。按照实参与形参的对应要求,当实参为数组名时,形参必须定义为与实参是同类型的数组。下一页返回7.5数组作函数参数当函数被调用时,需要形参变量分配存储单元。但当数组名作参数时,并不给形参数组分配存储单元,而是实现“换名操作”。即把实参的数组名,在函数中换成了形参数组名。由于实参数组和形参数组占有同一段内存单元,如果在函数中对形参数组元素的值进行修改,一定会使实参数组元素的值同时变化。上一页返回7.6变量的存储属性在使用变量时,要先说明它是何种数据类型,数据类型是变量的操作属性。除此之外,影响变量使用的还有变量的存储属性。存储属性反映了变量的如下3个特性。1.变量的存储器类型C语言允许程序员区分是在内存中还是在寄存器中开辟变量的存储空间。2.变量的生存期C语言的变量可以用两种方式建立:(1)在编译时分配存储单元,程序开始执行该变量存在,程序结束执行被撤销。这种变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间。它们是在静态存储区中分配存储空间的。下一页返回7.6变量的存储属性(2)只在程序执行的某一段时间内存在。如函数的形参和在函数体或分程序中定义的变量,只是在程序进入该函数或分程序时才分配存储空间,当该函数或分程序执行完毕后存储空间又被撤销了。它们是在动态存储区分配存储空间的,这种存储方式为动态存储。3.变量的可用域(可见性)分为全局可用与局部可用两种。C语言中,用“存储类别”来表示以上3个方面的属性。在定义一个变量时,除了指定其数据类型外,还可以指定其存储类别。C语言有用4个关键字来表示存储类别:auto(自动)、static(静态)、register(寄存器)和extern(外部)。上一页下一页返回7.6变量的存储属性7.6.1动态变量动态变量是在程序执行的某一时刻被动态的建立并在另一时刻被动态的撤销的一种变量。它们是在程序的局部说明的,也只是在这个局部可用,是局部变量。动态变量有两种:自动(auto)变量与寄存器(register)变量。1.自动变量自动变量用关键字auto作存储类别的说明。自动变量是在动态存储区分配存储空间,存储在动态存储区中。只能把函数或分程序中的变量说明为自动变量,当函数执行时为自动变量分配存储空间,当函数结束时释放自动变量所占的存储空间。2.寄存器变量寄存器变量用关键字register作存储类别的说明。寄存器变量是把CPU中的一个寄存器分配给它,目的是减少内存与CPU的数据交换上一页下一页返回7.6变量的存储属性通常把使用频率较高的变量定义为register类别,以期提高程序的执行效率。7.6.2静态变量静态变量的关键字是static。静态变量的存储空间在程序的整个运行期间是固定的。一个变量被指定为静态变量,在编译时即分配存储空间,程序一开始执行便被建立,直到程序执行结束都是存在的,即它的分配与释放与其所在的函数无关。静态变量可以是局部的静态变量,也可以是全局的静态变量。静态变量未初始化时,其初值为0。上一页下一页返回7.6变量的存储属性7.6.3外部变量外部变量也称(全程)变量,它是在函数外部定义的。存储在静态区,它的内存分配与释放是由系统完成的。全局变量未初始化时,其初值为0.全局变量的作用域是从定义它的位置开始,一直到本文件结束。图7.7表示局部变量与全局变量的作用域的不同,其中ch是全局变量,其作用域覆盖了fun2函数和主函数,在fun2函数中使用ch是正确的。但ch变量的作用域并不包括fun1的数,故在fun1函数中使用ch是错误的。全局变量虽然增加了函数传递数据的渠道,但它的使用函数的通用性降低。又因全局变量在程序执行期间一直占用内存空间,增加了内存开销。所以不在必要时,最好不使用全局变量。上一页下一页返回7.6变量的存储属性全局变量可以使用extern和static存储类别。1.外部(extern)存储类别当在一个文件要引用另一个文件中的全局变量或在全局变量之前要引用它时,可用extern作说明,这相当于扩大了全局变量的作用域。2.静态(static)存储类别由static说明的全局变量称为静态全局变量,它只能由本文件引用,即使在其他文件中用extern说明也不能使用,这样就可以限制全局变量的作用域的扩展。7.6.4内部函数和外部函数1.内部函数上一页下一页返回7.6变量的存储属性内部函数又称静态函数。定义函数时前面加上static类别,如:
staticintmax(intx,inty){returnx>y?x:y;}静态函数只局限于它所在文件,其他文件不能调用该函数。2.外部函数定义函数时被说明成extern类别的函数为外部函数。如:
externintmax(intx,inty){returnx>y?x:y;}函数的隐含类别就是extern类别,外部函数可以被其他文件调用。上一页返回7.7预处理C语言提供了预处理功能,对C语言在某些方面进行了扩充。预处理命令以“#”开始,它们可以出现在程序的任何地方。它们在编译之前被处理。预处理功能有宏定义,文件包含和条件编译3种。7.7.1宏定义1.不带参数的宏定义一般形式为:
#define标识符字符串在编译程序时,用“字符串”替换程序中所有出现的“标识符”。这种形式常用来定义符号常量,其中标识符也叫宏名。例如:
#definePI3.14下一页返回7.7预处理在定义它的文件中,将用3.14替代程序中所有的PI。这个替代过程是在正常的编译之前完成的,称“宏展开”。注意:(1)宏名一般用大写字母表示,以便与变量名相区别。(2)宏定义不是C语句,不必在行尾加分号。若加分号,会把分号当作字符串的一部分一同来替代宏名。(3)宏名的有效范围为定义命令之后到本文件结束。(4)程序中双引号内与宏名相同的字符串,不进行替换。(5)在进行宏定义时,可以引用已定义的宏名,可以层层置换。上一页下一页返回7.7预处理2.带参数的宏定义一般形式为:
#define宏名(参数表)字符串其中“参数表”是参数的列表,不说明类型。与不带参数的宏定义不同,带参数的宏定义的替换要分两步进行:(1)用“实参”的写法替代“形参”及字符串中出现的形参。(2)将宏名及参数表看成一个整体,来替代变化后的字符串。上一页下一页返回7.7预处理7.7.2文件包含文件包含是指一个文件可以把其他文件的内容包含进来,其一般格式为:
#include“文件名”或#include<文件名>前一种进行文件包含时,系统首先在当前目录中查找被包含的文件,找不到时再按系统指定的标准目录中查找:后一种格式仅在系统指定的目录中查找
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年杭州驾校测试题及答案
- 物理气体试题及答案高中
- 网络安全普法试题及答案
- 发动机试题集及答案
- 大专工程测量期末试题及答案
- 上半年湖北省口腔执业医师临床医学基础外科学考试题
- 农村人居环境治理农户参与意愿研究结题报告
- 企业跨国投资对东道国就业的影响研究报告
- 卫生院运营公司组织架构管理制度
- 购买宅基地签合同
- 2025-2026学年统编版九年级语文下册《出师表》知识点梳理
- 2025新奥集团春季校园招聘100人笔试历年参考题库附带答案详解
- 妊娠期肝内胆汁淤积症皮肤瘙痒护理查房
- (2026年版)《胰岛素静脉输注临床应用专家共识》2026版课件
- 长期照护师(初级)理论考试题库(含答案及解析)
- 竣工结算审核配合方案
- 2026年重庆市中考政治试题(附答案)
- 2025年广东省广州市初二学业水平地理生物会考真题试卷+解析及答案
- 保安考试100题及答案
- 通信器材入库检验手册
- 2026年山东省日照市公需科目考试题库
评论
0/150
提交评论