《C语言程序设计教程》第七章函数_第1页
《C语言程序设计教程》第七章函数_第2页
《C语言程序设计教程》第七章函数_第3页
《C语言程序设计教程》第七章函数_第4页
《C语言程序设计教程》第七章函数_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第7章函数7.1模块化程序设计的概念7.2库函数7.3函数的定义和调用7.4函数的返回值及其类型7.5函数调用时参数间的传递7.6函数的嵌套调用7.7函数的递归调用7.8作用域和存储类型7.1模块化程序设计的概念模块化程序设计,是将一个大型程序按照其功能分解成若干个相对独立的功能模块,然后再分别进行设计,最后把这些功能模块按照层次关系进行组装。基本思想是“自顶向下、逐步求精”。

C语言程序是一个函数式的程序结构,即C语言程序的全部功能都是由函数实现的,而每个函数对应一个独立的模块,通过函数间调用来实现程序的总体功能。如图7.1所示,是一个程序中函数调用示意图。在C语言中,函数分为主函数、库函数、用户自定义函数三种。程序的执行由主函数开始,然后调用其它函数,最终返回主函数结束。

main函数

a函数

b函数

c函数

d函数

e函数图7.1函数调用示意图返回章目录

7.2库函数

C语言提供了丰富的标准函数,即库函数。

7.2.1C语言常用库函数

1)数学函数调用数学库函数时,要求程序在调用数学库函数前应包含下面的头文件:

#include"math.h"

2)字符函数和字符串函数调用字符函数时,要求程序在调用字符函数前应包含下面的头文件:

#include"ctype.h"

调用字符串函数时,要求在源文件中应包含下面的头文件:

#include"string.h"

3)输入输出函数调用输入输出函数时,要求在源文件中应包含下面的头文件:

#include"stdio.h"

4)动态分配函数和随机函数调用动态分配函数和随机函数时,要求在源文件中应包含下面的头文件:

#include"stdlib.h"7.2.2标准库函数的调用

前面讲到,调用C语言标准库函数时必须在源程序中用include命令。

include命令的格式是:

#include<头文件名>

#include"头文件名"7.3函数的定义和调用由用户编写的函数称为自定义函数。

7.3.1

函数的定义函数定义的一般格式如下:类型说明符函数名(类型名形式参数1,类型名形式参数2,…)/*函数的首部*/{说明部分/*函数体*/

语句部分}

7.3.2函数的调用

1.函数调用的一般形式函数调用的一般形式为:函数名([实参表]);

如果是调用无参函数,则[实参表]可以没有,但括号不能省略。如果实参表列包含多个实参,则各实参间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。

2.函数调用的方式按函数在程序中出现的位置来分,有3种函数调用方式。

1)函数语句函数语句的调用,是指把被调函数作为一个独立的语句直接出现在主调函数中。

2)函数表达式被调函数出现在主调函数中的表达式中,这种表达式称为函数表达式。在被调函数中,必须有一个函数返回值,返回主调函数以参加表达式的运算。

3)函数参数函数参数的调用,是指被调函数作为另一个函数的参数时的调用,而另一个函数则是被调函数的主调函数。嵌套调用,如图7.2所示。

main函数

printf函数

max函数图7.2函数嵌套调用

3.调用函数时的注意事项调用函数时,应注意以下几点:

(1)被调函数必须是已存在的函数,可以是自定义函数,也可以是库函数。

(2)在主调函数中,要对被调函数先做声明。

(3)如果被调函数的返回值为int类型,则不管被调函数位置如何均不需要在主调函数中说明。关于函数声明的一般形式为:函数类型函数名(参数类型1,参数类型2…);

或函数类型函数名(参数类型1,参数名1,参数类型2,参数名2…);(4)如果被调用函数的声明放在源文件的开头,则该声明对整个源文件都有效。

(5)如果被调用函数的声明是在调用函数定义的内部,则该声明仅对该调用函数有效。

(6)在函数调用中,有下面几种情况可以省略声明:

a.如果调用函数和被调用函数是在同一个源文件中,而且被调用函数的定义是在调用函数之前。

b.函数的返回值是整数或字符。

c.所有被调用函数的声明都是在源文件开头。

d.如果被调用函数不是在源文件开头,而是在源文件中间且在所有函数之外某处被声明时,则在被声明之后引用它时,不必再声明,但在被声明之前引用它时,需要对其进行声明。

(7)如果调用函数和被调用函数的定义是在同一源文件中,应该先说明或定义被调用函数。7.4函数的返回值及其类型函数的返回值通过函数体内的return语句实现。return语句的格式如下:

return表达式;

return(表达式);

如果没有返回值,格式中的左、右圆括号可以省略,即写为:

return;7.5函数调用时参数间的传递函数之间的联系,是通过调用函数时参数的传递及函数值的返回。在定义函数时,函数名后面圆括号内的参数称形式参数。调用函数时,函数名后面圆括号内的参数为实参。

7.5.1变量、常量、数组元素作为函数参数在函数调用时,使用变量、常量或数组元素作为函数参数时,将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同存储单元,这种传递方式称为“值传递”。值传递的特点是单向传递,即只能把实参的值传递给形参,而形参值的任何变化都不会影响实参。

7.5.2数组名作为函数参数数组名作为函数参数时,不是值的单向传递,而是把实参数组的首地址传给形参数组,这个两个数组共用一段存储单元,即实参数组名和形参数组名共同指向数组的第一个元素。7.6函数的嵌套调用

C语言中的函数定义是互相独立的,函数和函数之间没有从属关系,一个函数既可以被其它函数调用,同时它也可以调用别的函数,这就是函数的嵌套调用。fun1main返回printffun2返回调用调用调用结束图7.4函数嵌套调用过程7.7函数的递归调用所谓递归,就是自己调用自己。函数的递归调用有两种形式:

(1)直接递归调用,即一个函数可直接调用该函数本身。

(2)间接递归调用,即一个函数可间接地调用该函数本身。7.8.1变量存在性和可见性C语言中,决定变量的性质主要依靠3个因素。第一是变量数据类型,它决定了变量的存储空间大小,诸如int、float等就是表达变量数据类型的关键字;第二是变量的作用域,它说明了一个变量在程序中起作用的范围;第三是变量的存储类型,它规定了在程序中将变量存放于何种存储机构上。作用域(也称可见性)是指变量起作用的程序范围。从作用域角度区分,变量可分为局部变量和全局变量。7.8作用域和存储类型变量的生存期(也称存在性)是指某一时间范围,在该时间范围内变量在内存中存放。从生存期角度来分,变量可分为静态变量和动态存储变量。静态存储变量存放在内存中的静态存储区,动态存储变量在内存中的动态存储区。因此静态变量在程序整个运行中都存在,而只有当包含动态存储变量的函数被调用时,才为该动态存储变量临时分配单元,所以动态存储变量只在函数的执行过程中存在。

7.8.2

局部变量和全局变量1.局部变量在一个函数内定义的变量称为内部变量,它只在本函数内有效,而在其它函数内不能使用,故这些变量又称为局部变量。

2

全局变量在函数外部定义的变量称为外部变量,外部变量是全局变量。全局变量的作用范围为:从定义全局变量位置开始到源程序结束。全局变量可以在其作用范围内由其它函数所共用。7.8.3变量的存储类型(1)auto变量函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。例如:intf(inta)/*定义f函数,a为参数*/{autointb,c=3;/*定义b,c自动变量*/……}a是形参,b,c是自动变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。(2)用static声明局部变量有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。【程序文本7.13】考察静态局部变量的值。f(inta){autob=0;staticc=3;b=b+1;c=c+1;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf("%d",f(a));}(3)register变量为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。【程序文本7.15】使用寄存器变量。intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*ireturn(f);}main(){inti;for(i=0;i<=5;i++)printf("%d!=%d\n",i,fac(i));}(4)extern声明外部变量外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。【程序文本7.16】用extern声明外部变量,扩展程序文件中的作用域。intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externA,B;printf("%d\n",max(A,B));}int

温馨提示

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

评论

0/150

提交评论