c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数

上传人:E**** 文档编号:102541148 上传时间:2019-10-03 格式:PPT 页数:31 大小:268KB
返回 下载 相关 举报
c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数_第1页
第1页 / 共31页
c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数_第2页
第2页 / 共31页
c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数_第3页
第3页 / 共31页
c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数_第4页
第4页 / 共31页
c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数》由会员分享,可在线阅读,更多相关《c语言程序设计教学课件作者闫会昌、罗勇胜第7章函数(31页珍藏版)》请在金锄头文库上搜索。

1、第7章 函数,7.1 函数定义 7.2 函数参数和函数返回值 7.3 函数调用 7.4 递归函数 7.5 数组作函数参数 7.6 变量的存储属性 7.7 预处理,第7章 函数,函数是构成C程序的基本程序单位。C语言函数分为两种:库函数和用户自定义函数。库函数是系统提供的已设计好的函数,只要指定了要调用函数所在的库文件,就可以直接调用了。用户自定义函数是用户自己编写的用来解决具体问题的函数。 (1)函数的定义 (2)函数参数和函数返回值 (3)函数调用 (4)递归调用 (5)向函数传递数组 (6)变量的存储属性 (7)编译预处理,返回,7.1 函数定义,函数定义的一般形式为: 类型符 函数名(形

2、式参数说明表) 说明部分 语句部分 其中: (1)“类型符”是函数的类型,即指当函数结束时所得结果的类型。当函数类型为int时,int可以省略不写;当函数不需要返回值时,可用void类型来表示它的类型。 (2)“函数名”是给函数起的名字,应符合标识符的有关规定。,下一页,返回,7.1 函数定义,(3)“形式参数说明表”是对形式参数的说明,它可有可无。当它省时,称该函数为无参函数,否则称有参函数。 一、有参函数:“形式参数说明表”中有参数。当参数有两个以上时,参数之间要用逗号分开。 二、无参函数:“形式参数说明表”中没有任何参数。 三、空函数:空函数是指参数为空,函数体也为空。,上一页,返回,7

3、.2 函数参数和函数返回值,调用函数时,主调函数和被调函数之间有数据传递关系。主调函数通过参数将数据传送到被调函数,被调函数通过返回值将函数的计算结果返回到主调函数。 7.2.1 形式参数和实际参数 在定义函数时,函数后面括号中的变量称为“形式参数”,简称“形参”。在调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参”。当函数调用时,将“实参”的值传送给“形参”变量。 (1)定义函数时,形参是变量,必须指定类型。形参变量需要的存储单元是在函数被调用时才给它分配,函数结束时予以释放。 (2)实参与形参在个数和类型上应一一对应。 (3)实参可以是常量、变量或表达式。但变量和表达式要有

4、确定的值。,下一页,返回,7.2 函数参数和函数返回值,(4)C语言中,参数的传递是“值传递”,即单向传递。数据只能由实参传送给形参,而不由形参传回给实参。 7.2.2 函数返回值 通常,在调用一个函数时,都希望被调函数通过计算得到一个值,这就是函数的返回值。函数的返回值是通过返回语句return实现的,返回语句的形式为: return; 或 return表达式; 说明: (1)如果要从被调函数带回一个值,被调函数中必须要有“return表达式”语句。函数中可以有多个return语句,执行到哪个,哪个就起作用且立即返回调用函数。,上一页,返回,7.3 函数调用,(2)函数的返回值要有一个确定的

5、类型,应该在定义函数时指定。 (3)为了明确函数的返回值,可用关键字“void”定义函数。 7.3.1 函数调用的一般形式 函数调用的一般形式为: 函数名(实参表) 如果是调用无参函数,则实参表可以没有,但括号不能省略。如果实参表包含多个实参,则各参数之间用逗号隔开。实参与形参的个数应相等、类型应一致。实参与形参按顺序对应,一一传递数据。,下一页,返回,7.3 函数调用,7.3.2 函数调用的方式 按函数在程序中出现的位置来分,可以有以下两种函数调用方式: 1.函数语句 即把函数调用作为一个语句。这时不要求函数带回值,只要求完成一定的操作,通常将函数定义为“void”类型。 2.函数表达式 函

6、数出现在可以写表达式的地方,此时需要函数的值来参加运算。 7.3.3 对被调函数的声明 函数声明是对所用到的自定义函数的特征进行必要的声明。编译系统以函数声明中给出的信息为依据,对函数的调用进行检测,以保证函,上一页,下一页,返回,7.3 函数调用,数调用、参数传递正确。 函数声明有以下3种格式。 格式1:函数类型 函数名(形参说明表); 格式2:函数类型 函数名(形参类型表); 格式3:函数类型 函数名(); (1)这三种声明格式除了对形参说明有所差别外,都向编译系统通知了两个必需的信息:函数名和函数类型。 (2)格式1的函数声明方式与函数定义首部一致,也称“函数原型”。在形参说明中对每一个

7、形参变量进行了详尽的描述:形参的类型及形参名。 (3)格式2是格式1的一种简化,并没有说明形参名。 (4)格式3是格式1的进一步简化,但这种简化少通知了关于形参的,上一页,下一页,返回,7.3 函数调用,信息。 (5)只要在函数调用之前进行函数声明即可。 (6)函数定义包含了函数声明,即当函数定义出现在主调函数之前,可不必进行函数声明。 (7)如果被调函数的函数值为int类型,也可以不必声明函数。 7.3.4 函数的嵌套调用 一个较大的程序一般有若干个程序模块,每一个模块用来实现一个特定的功能。在C语言中,模块是由函数来完成的,函数的使用使重复编写程序的工作量大大减小。一个C程序可由一个 主函

8、数和若干个函数构成。由主函数调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。主函数不允许其他函数调,上一页,返回,7.4 递归调用,用,而是由操作系统完成调用的。 C语言的函数定义都是相互平行、独立的,不允许嵌套定义,但允许嵌套调用。 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。如: int fun1(int x) int y,z; z=fun1(y); return z-10;,下一页,返回,7.4 递归调用,int fun2(int x) int y,z; z=fun3(y); re

9、turn z-10; int fun3(int t) int a,b; b=fun2(a); return a*b;,上一页,下一页,返回,7.4 递归调用,在调用fun1()函数的过程中,又调用了该函数本身,这是直接递归调用,见图7.2。在调用fun2()函数过程中要调用fun3()函数,而在调用fun3()函数过程中又调用fun2()函数,这是间接地递归调用,见图7.3 。,上一页,返回,7.5 数组作函数参数,函数实参可以为变量,数组元素同样是变量,也可以作函数的实参。此外,数组名也可以作函数的参数,传递整个数组。 7.5.1 数组元素作函数的实参 数组元素作函数的实参的用法与普通变量的

10、用法一致,是单向传递。 7.5.2 数组名作函数参数 当数组名作参数时,传递的是整个数组。按照实参与形参的对应要求,当实参为数组名时,形参必须定义为与实参是同类型的数组。,下一页,返回,7.5 数组作函数参数,当函数被调用时,需要形参变量分配存储单元。但当数组名作参数时,并不给形参数组分配存储单元,而是实现“换名操作”。即把实参的数组名,在函数中换成了形参数组名。 由于实参数组和形参数组占有同一段内存单元,如果在函数中对形参数组元素的值进行修改,一定会使实参数组元素的值同时变化。,上一页,返回,7.6 变量的存储属性,在使用变量时,要先说明它是何种数据类型,数据类型是变量的操作属性。除此之外,

11、影响变量使用的还有变量的存储属性。存储属性反映了变量的如下3个特性。 1.变量的存储器类型 C语言允许程序员区分是在内存中还是在寄存器中开辟变量的存储空间。 2.变量的生存期 C语言的变量可以用两种方式建立: (1)在编译时分配存储单元,程序开始执行该变量存在,程序结束执行被撤销。这种变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间。它们是在静态存储区中分配存储空间的。,下一页,返回,7.6 变量的存储属性,(2)只在程序执行的某一段时间内存在。如函数的形参和在函数体或分程序中定义的变量,只是在程序进入该函数或分程序时才分配存储空间,当该函数或分程序执行完毕后存储空间又被撤销了。

12、它们是在动态存储区分配存储空间的,这种存储方式为动态存储。 3.变量的可用域(可见性) 分为全局可用与局部可用两种。 C语言中,用“存储类别”来表示以上3个方面的属性。在定义一个变量时,除了指定其数据类型外,还可以指定其存储类别。C语言有用4个关键字来表示存储类别:auto(自动)、static(静态)、register(寄存器)和extern(外部)。,上一页,下一页,返回,7.6 变量的存储属性,7.6.1 动态变量 动态变量是在程序执行的某一时刻被动态的建立并在另一时刻被动态的撤销的一种变量。它们是在程序的局部说明的,也只是在这个局部可用,是局部变量。动态变量有两种:自动(auto)变量

13、与寄存器(register)变量。 1.自动变量 自动变量用关键字auto作存储类别的说明。自动变量是在动态存储区分配存储空间,存储在动态存储区中。只能把函数或分程序中的变量说明为自动变量,当函数执行时为自动变量分配存储空间,当函数结束时释放自动变量所占的存储空间。 2.寄存器变量 寄存器变量用关键字register作存储类别的说明。寄存器变量是把CPU中的一个寄存器分配给它,目的是减少内存与CPU的数据交换,上一页,下一页,返回,7.6 变量的存储属性,通常把使用频率较高的变量定义为register类别,以期提高程序的执行效率。 7.6.2 静态变量 静态变量的关键字是static。静态变量

14、的存储空间在程序的整个运行期间是固定的。一个变量被指定为静态变量,在编译时即分配存储空间,程序一开始执行便被建立,直到程序执行结束都是存在的,即它的分配与释放与其所在的函数无关。 静态变量可以是局部的静态变量,也可以是全局的静态变量。静态变量未初始化时,其初值为0。,上一页,下一页,返回,7.6 变量的存储属性,7.6.3 外部变量 外部变量也称(全程)变量,它是在函数外部定义的。存储在静态区,它的内存分配与释放是由系统完成的。全局变量未初始化时,其初值为0.全局变量的作用域是从定义它的位置开始,一直到本文件结束。 图7.7表示局部变量与全局变量的作用域的不同,其中ch是全局变量,其作用域覆盖

15、了fun2函数和主函数,在fun2函数中使用ch是正确的。但ch变量的作用域并不包括fun1的数,故在fun1函数中使用ch是错误的。 全局变量虽然增加了函数传递数据的渠道,但它的使用函数的通用性降低。又因全局变量在程序执行期间一直占用内存空间,增加了内存开销。所以不在必要时,最好不使用全局变量。,上一页,下一页,返回,7.6 变量的存储属性,全局变量可以使用extern和static存储类别。 1.外部(extern)存储类别 当在一个文件要引用另一个文件中的全局变量或在全局变量之前要引用它时,可用extern作说明,这相当于扩大了全局变量的作用域。 2.静态(static)存储类别 由st

16、atic说明的全局变量称为静态全局变量,它只能由本文件引用,即使在其他文件中用extern说明也不能使用,这样就可以限制全局变量的作用域的扩展。 7.6.4 内部函数和外部函数 1.内部函数,上一页,下一页,返回,7.6 变量的存储属性,内部函数又称静态函数。定义函数时前面加上static类别,如: static int max(int x,int y)return xy?x:y; 静态函数只局限于它所在文件,其他文件不能调用该函数。 2.外部函数 定义函数时被说明成extern类别的函数为外部函数。如: extern int max(int x,int y)return xy?x:y; 函数的隐含类别就是extern类别,外部函数可以被其他文件调用。,上一页,返回,7.7 预处理,C语言提供了预处理功能,对C语言在某些方面进行了扩充。预处理命令以“#”开始,它们可以出现在程序的任何地方。它们在编译之前被处理。 预处理功能有宏定义,文件包含和条件编译3种。 7.7.1 宏定义 1.不带参数的宏定义 一般形式为: #d

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号