第六章函数课件.ppt

上传人:春哥&#****71; 文档编号:12723866 上传时间:2022-04-25 格式:PPT 页数:46 大小:96.50KB
返回 下载 相关 举报
第六章函数课件.ppt_第1页
第1页 / 共46页
第六章函数课件.ppt_第2页
第2页 / 共46页
点击查看更多>>
资源描述

《第六章函数课件.ppt》由会员分享,可在线阅读,更多相关《第六章函数课件.ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C语言程序设计语言程序设计1第六章第六章-函数函数C语言程序设计语言程序设计2函数的分类函数的分类 1. 从从函数定义函数定义的角度看,可分为库函数和用户定义函数两种。的角度看,可分为库函数和用户定义函数两种。(1) 库函数库函数 由系统提供,用户无须定义,由系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程也不必在程序中作类型说明,只需在程序前包含有该函数原型的序前包含有该函数原型的头文件头文件即可调用。即可调用。 在前面各章中用到在前面各章中用到printf 、 scanf 等函数均属此类。等函数均属此类。 (2) 用户定义函数用户定义函数 由用户按需要写的函数。不仅要在程序中定

2、义函数本身,由用户按需要写的函数。不仅要在程序中定义函数本身, 而且在主调函而且在主调函数模块中还必须对该被调函数进行类型说明。数模块中还必须对该被调函数进行类型说明。C语言程序设计语言程序设计32. 语言的函数兼有其它语言中的语言的函数兼有其它语言中的函数和过程函数和过程两种功能,从两种功能,从这个角度看,函数分为以下两种。这个角度看,函数分为以下两种。(1) 有返回值函数有返回值函数 此类函数被调用执行完后将向调用者返回一个执行结果,此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数称为函数返回值。由用户定义的这种要返回函数值的函数,必须在函数定义和函数返回值。由用户定义的这种要

3、返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。说明中明确返回值的类型。(2) 无返回值函数无返回值函数 此类函数用于完成某项特定的处理任务,此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返执行完成后不向调用者返回函数值。由于函数无须返回值,用户在定义此类函数时可指定它的返回回函数值。由于函数无须返回值,用户在定义此类函数时可指定它的返回为为“空类型空类型”, 空类型的说明符为空类型的说明符为“void”。函数的分类函数的分类C语言程序设计语言程序设计4 3. 从主调函数和被调函数之间从主调函数和被调函数之间数据传送数据传送的角度看又可分为无的角度看又可分为无参函数和

4、有参函数两种。参函数和有参函数两种。(1). 无参函数无参函数 函数定义、函数说明及函数调用中均不带参数。函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数主调函数和被调函数之间不进行参数传送。之间不进行参数传送。(2). 有参函数有参函数在函数定义及函数说明时都有参数,称为形式参数在函数定义及函数说明时都有参数,称为形式参数(简称为形参简称为形参)。在函数调。在函数调用时也必须给出参数,称为实际参数用时也必须给出参数,称为实际参数(简称为实参简称为实参)。 进行函数调用时,主调进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。函数将把实参的值传送给形参,供被调函数使

5、用。函数的分类函数的分类C语言程序设计语言程序设计5说明:说明: 1、在语言中,所有的函数定义,包括主函数在语言中,所有的函数定义,包括主函数main在内,都是平行在内,都是平行的。也就是说,在一个函数的函数体内,的。也就是说,在一个函数的函数体内, 不能再定义另一个函数,不能再定义另一个函数, 即不即不能嵌套定义。能嵌套定义。 2、但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。为主调函数。 函数还可以自己函数还可以自己调用自己,称为递归调用。调用自己,称为递归调用。 3、一个源程序有一个或多个函数组成,但是只能

6、有且仅有一个主一个源程序有一个或多个函数组成,但是只能有且仅有一个主函数函数main。 4、main 函数是主函数,它可以调用其它函数,而不允许被其它函数函数是主函数,它可以调用其它函数,而不允许被其它函数调用。调用。 因此,程序的执行总是从因此,程序的执行总是从main函数开始,函数开始, 完成对其它函数的调完成对其它函数的调用后再返回到用后再返回到main函数,最后由函数,最后由main函数结束整个程序。函数结束整个程序。函数的分类函数的分类C语言程序设计语言程序设计6函数定义函数定义1.无参函数的定义形式无参函数的定义形式 类型说明符类型说明符 函数名函数名() 声明部分声明部分 语句语

7、句 类型说明符和函数名称为类型说明符和函数名称为函数头函数头。 类型说明符指明了本函数的类型,类型说明符指明了本函数的类型,实际上就是函数返回值的类型。实际上就是函数返回值的类型。 中的内容称为中的内容称为函数体函数体。 在函数体中也有类型说明,在函数体中也有类型说明, 这是对函数体这是对函数体内部所用到的变量的类型说明。内部所用到的变量的类型说明。 C语言程序设计语言程序设计72.有参函数定义的一般形式有参函数定义的一般形式 类型说明符类型说明符 函数名函数名(形式参数类型说明形式参数类型说明 形式参数形式参数 .) 声明部分声明部分 语句语句 有参函数比无参函数多两点,其一是有参函数比无参

8、函数多两点,其一是形式参数类型说明形式参数类型说明,其二,其二是是形式参数形式参数, 它们可以是各种类型的变量,它们可以是各种类型的变量, 在进行函数调用时,在进行函数调用时,主调函数将赋予这些形式参数实际的值。主调函数将赋予这些形式参数实际的值。函数定义函数定义C语言程序设计语言程序设计83.空函数空函数 类型说明符类型说明符 函数名函数名( ) 调用此函数时,不执行任何工作。其作用是用于函数的扩充。调用此函数时,不执行任何工作。其作用是用于函数的扩充。4.对形参声明的传统方式对形参声明的传统方式 类型说明符类型说明符 函数名函数名(形式参数形式参数 .) 形式参数类型说明形式参数类型说明

9、声明部分声明部分 语句语句 函数定义函数定义C语言程序设计语言程序设计9函数的参数函数的参数 1. 形参出现在函数定义中形参出现在函数定义中,在整个函数体内都可以使用,函数未被调用,在整个函数体内都可以使用,函数未被调用时,系统不给它分配存储空间,当函数被调用时系统才给分配储存空间,时,系统不给它分配存储空间,当函数被调用时系统才给分配储存空间,用来接受从主调函数传递过来的数据,当该函数调用结束后,则立即释放用来接受从主调函数传递过来的数据,当该函数调用结束后,则立即释放其储存空间。其储存空间。 2. 实参出现在主调函数中实参出现在主调函数中,即调用时写入函数括号中的参数,要求有确,即调用时写

10、入函数括号中的参数,要求有确定的值。调用时将实参数据传递给对应的形参,进入被调函数后,实参变定的值。调用时将实参数据传递给对应的形参,进入被调函数后,实参变量不能使用。量不能使用。 3. 形参与实参的的关系:形参和实参的功能是作数据传递。发生函数调形参与实参的的关系:形参和实参的功能是作数据传递。发生函数调用时(形、实结合)用时(形、实结合), 主调函数把实参的值传送给被调函数的形参从而实主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。现主调函数向被调函数的数据传送。C语言程序设计语言程序设计10说明说明:函数的形参和实参具有以下特点函数的形参和实参具有以下特点 1

11、. 形参变量只有在被调用时才分配内存单元,调用结束时释放所形参变量只有在被调用时才分配内存单元,调用结束时释放所分配的内存单元。因此,形参只有在函数内部有效。分配的内存单元。因此,形参只有在函数内部有效。 2.实参可以是常量、变量、表达式、函数等。但是它们都必须是实参可以是常量、变量、表达式、函数等。但是它们都必须是有确定的值。有确定的值。 3. 实参和形参在数量上,类型上,顺序上应严格一致。实参和形参在数量上,类型上,顺序上应严格一致。 4. 函数调用中发生的数据传送是单向的。因此在函数调用过程中,函数调用中发生的数据传送是单向的。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化

12、。形参的值发生改变,而实参中的值不会变化。 C语言程序设计语言程序设计11函数的返回值函数的返回值函数的值是指通过函数调用使主调函数得到一个确定的值。函数的值是指通过函数调用使主调函数得到一个确定的值。 1. return语句返回函数的值。语句返回函数的值。 return 语句使用的一语句使用的一 般形式:般形式: return 表达式;表达式; 或或 return (表达式表达式); 在函数中允许有多个在函数中允许有多个return语句,但每次调用只能有一个语句,但每次调用只能有一个return 语句被执行,语句被执行, 因此只能返回一个函数值。因此只能返回一个函数值。C语言程序设计语言程序

13、设计12 2. 函数值的类型和函数定义中函数的类型应保持一致。函数值的类型和函数定义中函数的类型应保持一致。 如果两者不一致,则以函数类型为准,自动进行类型转换。如果两者不一致,则以函数类型为准,自动进行类型转换。3. 如函数值为整型,在函数定义时可以省去类型说明。如函数值为整型,在函数定义时可以省去类型说明。4. 不返回函数值的函数,可以明确定义为不返回函数值的函数,可以明确定义为“空类型空类型”, 类型说明符为类型说明符为“void”。函数的返回值函数的返回值C语言程序设计语言程序设计13函数的调用函数的调用函数调用的一般形式函数调用的一般形式 函数名函数名(实际参数表实际参数表) 实参的

14、类型,个数,顺序都应与形参一致。实参的类型,个数,顺序都应与形参一致。1. 函数表达式函数表达式 函数作为表达式中的一项出现在表达式中,以函数返回值函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。参与表达式的运算。这种方式要求函数是有返回值的。这种方式要求函数是有返回值的。 例如:例如: z=max(x,y) 是一个赋值表达式,把是一个赋值表达式,把max的返回值赋予变量的返回值赋予变量z。C语言程序设计语言程序设计142.函数语句函数语句 函数调用的一般形式加上分号即构成函数语句,即:函数调用的一般形式加上分号即构成函数语句,即: 函数名函数名(实际参数表实际参数表);例

15、如:例如: printf (%d,a); 3.函数实参函数实参 函数作为另一个函数调用的实际参数出现。函数作为另一个函数调用的实际参数出现。把该函数的把该函数的返回值作为实参进行传送,要求该函数必须是有返回值的。返回值作为实参进行传送,要求该函数必须是有返回值的。 例如:例如: printf(%d,max(x,y); 即是把即是把max调用的返回调用的返回值又作为值又作为printf函数的实参来使用的。函数的实参来使用的。函数的调用函数的调用C语言程序设计语言程序设计15函数的嵌套调用函数的嵌套调用 语言中不允许作嵌套的函数定义。但是语言允许在语言中不允许作嵌套的函数定义。但是语言允许在一个函

16、数的定义中出现对另一个函数的调用。一个函数的定义中出现对另一个函数的调用。 这样就出现了这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。函数的嵌套调用。即在被调函数中又调用其它函数。main()fa();.fb();fa().fb();.fb(); . C语言程序设计语言程序设计16函数的递归调用函数的递归调用一个函数在它的函数体内直接或间接调用它自身称为一个函数在它的函数体内直接或间接调用它自身称为递归调用递归调用一个问题的递归可以分为一个问题的递归可以分为“回推回推”和和“递推递推”两个阶段。两个阶段。构成递归的条件:构成递归的条件: 递归结束条件及结束时的值;递归结束条件及结束

17、时的值; 能用递归形式表示,并且递归向终止条件发展。能用递归形式表示,并且递归向终止条件发展。C语言程序设计语言程序设计17下面举例说明递归调用的执行过程。下面举例说明递归调用的执行过程。 例:用递归法计算例:用递归法计算n!用递归法计算用递归法计算n!可用下述公式表示:可用下述公式表示: n!=1 (n=0,1) n(n-1)! (n1) 按公式可编程如下:按公式可编程如下:long ff(int n) long f; if(n0) printf(n0,input error); else if(n=0|n=1) f=1; else f=ff(n-1)*n; return(f);main()

18、 int n; long y; printf(input n= :n); scanf(%d,&n); y=ff(n); printf(%d!=%ld,n,y); C语言程序设计语言程序设计18数组作为函数参数数组作为函数参数一、数组元素作函数实参数一、数组元素作函数实参数数组元素作为函数的实参与普通变量作实参数并无区别。数组元素作为函数的实参与普通变量作实参数并无区别。 在发生函数调用时,在发生函数调用时, 把作为实参的数组元素的值传送给把作为实参的数组元素的值传送给形参,实现单向的值传送。形参,实现单向的值传送。C语言程序设计语言程序设计19数组作为函数参数数组作为函数参数二、数组名作为函数

19、参数二、数组名作为函数参数 用数组名作函数参数时,用数组名作函数参数时, 则要求形参和相对应的实参都则要求形参和相对应的实参都必须是类型相同的数组(或指针变量)。必须是类型相同的数组(或指针变量)。 数组名代表数组的首地址。因此在数组名代表数组的首地址。因此在数组名作函数参数时所进行数组名作函数参数时所进行的传送只是地址的传送的传送只是地址的传送, 把实参数组的首地址赋予形参数组名。把实参数组的首地址赋予形参数组名。形参数组名取得该首地址,也就等于有了实在的数组。形参数组名取得该首地址,也就等于有了实在的数组。实际上实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。是形参数组和实参数

20、组为同一数组,共同拥有一段内存空间。 数据传递的双向的。数据传递的双向的。C语言程序设计语言程序设计20数组作为函数参数数组作为函数参数例例 写一用选择法排序的函数,写一用选择法排序的函数,调用该函数排序。调用该函数排序。/*选择法排序函数选择法排序函数*/void sort(int a ,int n) int i,j,s,p; for(i=0;in-1;i+) p=i; for(j=i+1;jn;j+) if(apaj) p=j; if(i!=p) s=ai; ai=ap; ap=s; /*主函数调用排序函数:主函数调用排序函数:*/void sort(int a ,int n); main

21、() int i,j,p,a10; for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d , ai); C语言程序设计语言程序设计21变量的作用域变量的作用域概念:概念:变量的有效性范围称变量的作用域。变量的有效性范围称变量的作用域。 语言中的变量,按作用域范围可分为语言中的变量,按作用域范围可分为局部变量局部变量和和全局变量全局变量。一、局部变量一、局部变量(也称为内部变量也称为内部变量) 局部变量是在函数内作定义说明的。局部变量是在函数内作定义说明的。包括一个函数的形参和内部定义的变量。其作用域仅限于函数内

22、。包括一个函数的形参和内部定义的变量。其作用域仅限于函数内。C语言程序设计语言程序设计22变量的作用域变量的作用域关于局部变量的作用域还要说明以下几点:关于局部变量的作用域还要说明以下几点: 1. 主函数中定义的变量也只能在主函数中使用,不能在其它函主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。因为主函数也是一个函数,它与其它函数是平行关系。数中使用。因为主函数也是一个函数,它与其它函数是平行关系。 2. 形参变量是属于被调函数的局部变量,实参变量是属于主调形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。函数的局部变量。 3. 允许在不同的函数中使用相同的变

23、量名,它们代表不同的对允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。象,分配不同的单元,互不干扰。 4. 在复合语句中也可定义变量,其作用域只在复合语句范围内。在复合语句中也可定义变量,其作用域只在复合语句范围内。C语言程序设计语言程序设计23变量的作用域变量的作用域二、全局变量二、全局变量(也称为也称为外部变量)外部变量)在在函数外部函数外部定义的变量。它不属于某个函数,而是属于这定义的变量。它不属于某个函数,而是属于这个个源程序文件源程序文件。其其作用域作用域是是从定义变量的位置开始到本源文件结束从定义变量的位置开始到本源文件结束。用。用全全局变量的说明

24、符局变量的说明符extern来声明可以扩展外部变量的作用域。来声明可以扩展外部变量的作用域。C语言程序设计语言程序设计24变量的作用域变量的作用域 int a,b; /*外部变量外部变量*/ void f1() /*函数函数f1*/ 全局变量全局变量a,b作用域作用域 float x,y;/*外部变量外部变量*/ int fz() /*函数函数fz*/ 全局变量全局变量x,y作用域作用域 main() /*主函数主函数*/ C语言程序设计语言程序设计25变量的作用域变量的作用域对于全局变量还有以下几点说明:对于全局变量还有以下几点说明:1.全局变量的缺点:全局变量的缺点:(1)全局变量在程序全

25、部执行过程中都占用存储单元。)全局变量在程序全部执行过程中都占用存储单元。(2)降低了函数的通用性。降低程序的清晰性。)降低了函数的通用性。降低程序的清晰性。2.如果在同一个源文件中,外部变量与局部变量同名,则在如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被局部变量的作用范围内,外部变量被“屏蔽屏蔽”,即不起作用。,即不起作用。C语言程序设计语言程序设计26变量的存储类型变量的存储类型各种变量的作用域不同,各种变量的作用域不同, 其本质是变量的存储类型不同。所谓其本质是变量的存储类型不同。所谓存储类型存储类型是指变量占用内存空间的方式,是指变量占用内存空间的

26、方式, 也称为也称为存储方式存储方式。 变量的存储方式分为变量的存储方式分为“静态存储静态存储”和和“动态存储动态存储”两种。两种。静态存储变量静态存储变量通常是在变量定义时就分定存储单元并一直保持通常是在变量定义时就分定存储单元并一直保持 不变,不变, 直至整个程序结束。直至整个程序结束。 动态存储变量动态存储变量是在程序执行过程中,使用它时才分配存储单元,是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。使用完毕立即释放。 C语言程序设计语言程序设计27 说明:说明: 动态存储变量动态存储变量典型的例子是函数的典型的例子是函数的形式参数形式参数,在函数定义,在函数定义时并不给

27、形参分配存储单元,只是在函数被调用时分配,时并不给形参分配存储单元,只是在函数被调用时分配, 调用调用函数完毕立即释放。函数完毕立即释放。 由于变量存储方式不同而产生的特性称变量的由于变量存储方式不同而产生的特性称变量的生存期生存期。 生存期表示了变量存在的时间。生存期表示了变量存在的时间。 生存期生存期和和作用域作用域是从是从时间时间和和空间空间这两个不同的角度来描述这两个不同的角度来描述变量的特性。变量的特性。 变量的存储类型变量的存储类型C语言程序设计语言程序设计28变量的存储类型变量的存储类型 语言中,对变量的存储类型说明有以下四种:语言中,对变量的存储类型说明有以下四种: auto

28、自动变量自动变量 register 寄存器变量寄存器变量 extern 外部变量外部变量 static 静态变量静态变量 自动变量和寄存器变量属于动态存储方式,自动变量和寄存器变量属于动态存储方式, 外部变量和静态变外部变量和静态变量属于静态存储方式。量属于静态存储方式。 变量说明的完整形式应为:变量说明的完整形式应为: 存储类型说明符存储类型说明符 数据类型说明符数据类型说明符 变量名,变量名变量名,变量名; 例例 static int a,b; 说明说明a,b为静态类型变量为静态类型变量 auto char c1,c2; 说明说明c1,c2为自动字符变量为自动字符变量(省略)省略) ext

29、ern int x,y; 说明说明x,y为外部整型变量为外部整型变量C语言程序设计语言程序设计29变量的存储类型变量的存储类型一、自动变量类型一、自动变量类型函数内凡未加存储类型说明的变量均视为自动变量,自动函数内凡未加存储类型说明的变量均视为自动变量,自动变量可省去说明符变量可省去说明符auto。自动变量具有以下特点:自动变量具有以下特点:1. 自动变量的作用域仅限于定义该变量的个体内。自动变量的作用域仅限于定义该变量的个体内。2. 自动变量属于动态存储方式,只有定义该变量的函数被调用自动变量属于动态存储方式,只有定义该变量的函数被调用时才给它分配存储单元,函数调用结束,释放存储单元,时才给

30、它分配存储单元,函数调用结束,释放存储单元,结束生存期。函数调用结束之后,自动变量的值不能保留。结束生存期。函数调用结束之后,自动变量的值不能保留。3. 不同的个体中允许使用同名的变量。不同的个体中允许使用同名的变量。C语言程序设计语言程序设计30变量的存储类型变量的存储类型二、外部变量二、外部变量 外部变量的类型说明符为外部变量的类型说明符为extern。 外部变量的几个特点:外部变量的几个特点:1. 外部变量和全局变量是对同一类变量的两种不同角度的外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从作用域角度提出的,外部变量从它的提法。全局变量是从作用域角度提出的,外部变量从

31、它的存储方式提出的,表示了它的生存期。存储方式提出的,表示了它的生存期。C语言程序设计语言程序设计31 int a,b; /*外部变量外部变量*/ void f1() /*函数函数f1*/ 全局变量全局变量a,b作用域作用域 extern float x,y;/*外部变量外部变量*/ int fz() /*函数函数fz*/ main() /*主函数主函数*/ 2.外部变量的说明符外部变量的说明符extern声明可扩展外部变量的作用域声明可扩展外部变量的作用域C语言程序设计语言程序设计323. 当一个源程序由若干个源文件组成时,在一个源文件中定义当一个源程序由若干个源文件组成时,在一个源文件中定

32、义的外部变量在其它的源文件中也有效。例如有一个源程序由源的外部变量在其它的源文件中也有效。例如有一个源程序由源文件文件 F1.C和和F2.C组成:组成: F1.C int a,b;/*外部变量定义外部变量定义*/ char c; /*外部变量定义外部变量定义*/ main() F2.C extern int a,b; /*外部变量说明外部变量说明*/ extern char c; /*外部变量说明外部变量说明*/ func (int x,y) C语言程序设计语言程序设计33三、静态变量三、静态变量静态变量属于静态存储方式,但是静态变量属于静态存储方式,但是属于静态存储方式的量不一属于静态存储方

33、式的量不一定就是静态变量定就是静态变量, 例如外部变量。例如外部变量。变量由变量由static进行再说明,可改变其原有的存储进行再说明,可改变其原有的存储方式或作用域。方式或作用域。 由由static定义外部变量后成为定义外部变量后成为静态外部变量静态外部变量,或称静态全局变量。,或称静态全局变量。 用用static定义自动变量为定义自动变量为静态自动变量静态自动变量,或称静态局部变量。,或称静态局部变量。C语言程序设计语言程序设计34静态局部变量属于静态存储方式,它具有以下特点:静态局部变量属于静态存储方式,它具有以下特点: (1) 静态局部变量在函数内定义,但不同于自动变量(调用时就静态局

34、部变量在函数内定义,但不同于自动变量(调用时就存在,退出函数时消失),存在,退出函数时消失),静态局部变量始终存在着,它的生存静态局部变量始终存在着,它的生存期为整个源程序。期为整个源程序。 (2) 静态局部变量的作用域与自动变量相同,静态局部变量的作用域与自动变量相同,只能在定义该变只能在定义该变量的函数内使用它。退出该函数后,量的函数内使用它。退出该函数后, 尽管该变量还继续存在,但尽管该变量还继续存在,但其他函数不能使用它。其他函数不能使用它。 (3) 对基本类型的静态局部变量若在说明时未赋以初值,则系对基本类型的静态局部变量若在说明时未赋以初值,则系统自动统自动 赋予赋予0值。值。而对

35、自动变量不赋初值,则其值是不定的。而对自动变量不赋初值,则其值是不定的。 1. 静态局部变量静态局部变量 在局部变量的说明前加在局部变量的说明前加static就构成静态局部变量。就构成静态局部变量。 C语言程序设计语言程序设计352.静态全局变量静态全局变量 全局变量全局变量(外部变量外部变量)的说明之前再冠以的说明之前再冠以static 就构成了就构成了静态的全局变量。静态的全局变量。 这两者的区别这两者的区别: 当一个源程序由多个源文件组成时,非当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。静态的全局变量在各个源文件中都是有效的。 而静态全局而静态全局变量则限制

36、了其作用域,即只在定义该变量的源文件内有效。变量则限制了其作用域,即只在定义该变量的源文件内有效。 从中可以看出,从中可以看出, 局部变量变为静态变量后改变了它的局部变量变为静态变量后改变了它的存储方式(改变了生存期)。存储方式(改变了生存期)。全局变量变为静态变量后是改全局变量变为静态变量后是改变了它的作用域。变了它的作用域。因此因此static 这个说明符在不同的地方所起这个说明符在不同的地方所起的作用是不同的。应予以注意。的作用是不同的。应予以注意。 C语言程序设计语言程序设计36内部函数和外部函数内部函数和外部函数一、内部函数一、内部函数 如果在一个源文件中定义的函数只能被本文件中的函

37、数如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,调用,而不能被同一源程序其它文件中的函数调用, 这种函这种函数称为内部函数。数称为内部函数。 定义内部函数的一般形式是:定义内部函数的一般形式是: static 类型说明符类型说明符 函数名函数名(形参表形参表) 例如:例如: static int f(int a,int b) 内部函数也称为静态函数。但此处静态内部函数也称为静态函数。但此处静态static 指对函数的指对函数的调用范围只局限于本文件。调用范围只局限于本文件。C语言程序设计语言程序设计37二、外部函数二、外部函数 外部函数在整个源程

38、序中都有效。外部函数在整个源程序中都有效。 定义的一般形式为:定义的一般形式为: extern 类型说明符类型说明符 函数名函数名(形参表形参表) 例如:例如: extern int f(int a,int b) 如在函数定义中没有说明,则隐含为如在函数定义中没有说明,则隐含为extern。 在一个源文件的函数中调用其它源文件中定义的外部函数在一个源文件的函数中调用其它源文件中定义的外部函数时,应用时,应用extern说明被调函数为外部函数。说明被调函数为外部函数。例如:例如:C语言程序设计语言程序设计38F1.C (源文件一源文件一) main() extern int f1(int i);

39、 /*外部函数说明,表示外部函数说明,表示f1函函 数在其它源文件中数在其它源文件中*/ F2.C (源文件二源文件二) extern int f1(int i); /*外部函数定义外部函数定义*/ C语言程序设计语言程序设计39 以下程序的输出结果是以下程序的输出结果是int f(int k ) static int i=0; int s=1; s=s+k+i; i+; return s; main() int i,a=0; for(i=0;i5;i+) a+=f(i); printf(%dn,a); A) 20 B) 24C) 25 D) 15C语言程序设计语言程序设计40以下程序运行后,

40、输出结果是以下程序运行后,输出结果是 int d=1; fun(int p) int d=5; d+=p+; printf(%d,d);); main()() int a=3; fun(a);); d+=a+; printf(%dn,d); C语言程序设计语言程序设计41 有以下程序有以下程序int a=3; main() int s=0; int a=5; s+=a+; printf(%d, %d n ,s,a); s+=a+; printf(%d, %d n,s,a); 程序运行后的输出结果是程序运行后的输出结果是C语言程序设计语言程序设计42 程序运行的输出结果是:程序运行的输出结果是:

41、#include stdio.hint x,y,z;void p(int *x,int y)+*x;y-;z=*x+y;printf(%d,%d,%d ,*x,y,z)void main() x=2;y=3;z=4;p(&x,y);printf(%d,%d,%d ,x,y,z);p(&y,x);printf(%d,%d,%dn,x,y,z);C语言程序设计语言程序设计43#include int a10=1,2,3,4,5,6,7; rev (m,n) int *m,n; int t; if (n1) t=*m;*m=*(m+n-1); *(m+n-1)=t; rev(m+1,n-2); ma

42、in() int i; rev(a+2,6); for(i=0;i10;i+) printf(%d,ai); printf(n); rev(a,5); for(i=0;i10;i+) printf(%d,ai); printf(n); C语言程序设计语言程序设计44本章小结本章小结1. 函数的分类函数的分类(1)库函数:由库函数:由C系统提供的函数;系统提供的函数;(2)用户定义函数:由用户自己定义的函数;用户定义函数:由用户自己定义的函数;(3)有返回值的函数有返回值的函数:向调用者返回函数值,应说明函数类型向调用者返回函数值,应说明函数类型( 即即返回值的类型返回值的类型 );(4)无返回

43、值的函数:不返回函数值,说明为空无返回值的函数:不返回函数值,说明为空(void)类型;类型;(5)有参函数:主调函数向被调函数传送数据;有参函数:主调函数向被调函数传送数据;(6)无参函数:主调函数与被调函数间无数据传送;无参函数:主调函数与被调函数间无数据传送;(7)内部函数:只能在本源文件中使用的函数;内部函数:只能在本源文件中使用的函数;(8)外部函数:可在整个源程序中使用的函数。外部函数:可在整个源程序中使用的函数。C语言程序设计语言程序设计452. 函数定义的一般形式函数定义的一般形式 extern/static 类型说明符类型说明符 函数名函数名(形参表形参表)。3.函数说明的一

44、般形式函数说明的一般形式: extern 类型说明符类型说明符 函数名函数名(形参表形参表);4. 函数调用的一般形式:函数调用的一般形式: 函数名函数名(实参表实参表) 5. 函数的参数分为形参和实参两种,形参出现在函数定义中,函数的参数分为形参和实参两种,形参出现在函数定义中,实参出现在函数调用中,发生函数调用时,将把实参的值传送实参出现在函数调用中,发生函数调用时,将把实参的值传送给形参。给形参。6. 函数的值是指函数的返回值,在函数中由函数的值是指函数的返回值,在函数中由return语句返回的。语句返回的。7. 数组名作为函数参数时不进行值传送而进行地址传送。形数组名作为函数参数时不进

45、行值传送而进行地址传送。形参和实参实际上为同一数组的两个名称。因此形参数组的值发参和实参实际上为同一数组的两个名称。因此形参数组的值发生变化,实参数组的值当然也变化。生变化,实参数组的值当然也变化。C语言程序设计语言程序设计46 8. 语言中,允许函数的嵌套调用和函数的递归调用。语言中,允许函数的嵌套调用和函数的递归调用。 9. 可从三个方面对变量分类,即变量的数据类型,变量作可从三个方面对变量分类,即变量的数据类型,变量作用域和变量的存储类型。在第二章中主要介绍变量的数据类型,用域和变量的存储类型。在第二章中主要介绍变量的数据类型,本章中介绍了变量的作用域和变量的存储类型。本章中介绍了变量的作用域和变量的存储类型。 10.变量的作用域是指变量在程序中的有效范围,变量的作用域是指变量在程序中的有效范围, 分为局部分为局部变量和全局变量。变量和全局变量。 11.变量的存储类型是指变量在内存中的存储方式,分为静变量的存储类型是指变量在内存中的存储方式,分为静态存储和动态存储,表示了变量的生存期。态存储和动态存储,表示了变量的生存期。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁