《高级语言程序设计》课件第6章函数.pptx

上传人(卖家):momomo 文档编号:7650656 上传时间:2024-05-23 格式:PPTX 页数:20 大小:168.75KB
下载 相关 举报
《高级语言程序设计》课件第6章函数.pptx_第1页
第1页 / 共20页
《高级语言程序设计》课件第6章函数.pptx_第2页
第2页 / 共20页
《高级语言程序设计》课件第6章函数.pptx_第3页
第3页 / 共20页
《高级语言程序设计》课件第6章函数.pptx_第4页
第4页 / 共20页
《高级语言程序设计》课件第6章函数.pptx_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、第6章 函数6.1 函数的定义6.2 函数的调用6.3 数组与函数6.4 变量的作用域6.5 变量的生存期第6章 函数6.1 函数的定义第6章 函数函数在使用时也需要遵循“先定义、后使用”的原则。定义函数就是对函数功能的确立。其一般格式为函数的定义分为函数首部和函数体两部分。函数首部即“”以上的一行说明,包括返回值类型、函数名、形式参数列表;函数体则是从“”开始,到“”结束的代码块,函数体又分为声明部分和语句部分。一个函数实际上就是“输入处理输出”模型的一种具体表现。C语言程序的运行都是从主函数开始并且在主函数结束的;两个标准库函数,分别是printf函数和scanf函数,通过使用预编译命令“

2、#include”包含标准输入/输出头文件,即可直接调用这两个函数;程序中还出现了六个用户自定义函数,分别是start函数、end函数、sum函数、avg函数、max函数和min函数,这几个函数必须在源文件中独立定义之后,方可使用。程序在运行过程中,主函数可以通过函数名调用不同的函数,即将程序的控制权交给被调用函数,并执行被调用函数的函数体,以实现被调用函数的特定功能。被调用函数运行结束后,程序的控制权又返回到主函数的调用位置,继续执行主函数体内的后续语句。第6章 函数6.1.1 函数名函数名即函数的标识符,其命名规则与C语言中其他标识符的命名规则一致。程序是通过函数名来找到该函数所在内存单元

3、的,从而实现对该函数的调用。程序首先通过函数名main找到主函数的内存单元,依次执行单元内的指令;在主函数的执行过程中还会根据不同的被调函数名,找到相应的被调函数的内存单元,执行被调函数。6.1.2 返回值类型与return语句函数的类型即定义时的返回值类型,一般情况下,函数完成特定的功能或者数据处理之后,会将处理结果反馈给调用者(也称为主调对象)。这个被反馈的结果称为返回值,通过return语句实现;函数的返回值类型则用来说明该结果的数据类型。关于返回值类型与return语句的使用,有以下约束条件:(1)在绝大多数情况下,函数定义的返回值类型与return语句中返回值的数据类型是一致的。(2

4、)在定义函数时,如果不规定返回值类型,则默认该函数的返回值类型为int型。(3)如果调用某个函数只是为了实现一组特定的操作,而不需要获得反馈结果,可将该函数的返回值类型定义为void类型,函数体内不需要使用return语句。(4)函数定义的返回值类型与return语句中返回值的数据类型不一致时,则以函数定义的返回值类型为准,将return语句中的返回值数据进行强制类型转换。第6章 函数(5)return语句中的返回值可以是常量,也可以是变量,还可以是表达式。(6)一条return语句只能有一个返回值;一个函数可以包含多条return语句,但是程序运行过程中只能有一条return语句会被执行。(

5、7)return语句的一般格式为“return(表达式);”表达式的括号也可以省略。(8)一旦执行return语句,把处理结果返回给主调对象,将控制权交还给主调对象,并结束函数的调用。6.1.3 函数的形参与实参在大多数情况下,主调对象和被调函数之间需要通过各自的参数实现数据传递。函数的参数分为形式参数(简称“形参”)和实际参数(简称“实参”)。在定义函数时,函数首部中的参数为形参;在调用函数时,调用表达式中的参数为实参。形参与实参之间的关系,有如下约束条件:(1)在定义函数时,需要在函数首部说明形参的类型与名称。如果有多个形参,参数之间需要用逗号间隔。如果函数调用时不需要主调对象传递数据,则

6、在定义函数时可以没有形参,但函数名后的括号不能省。(2)在调用函数时,调用表达式中的实参必须与形参数目一致,如果有多个实参,参数之间需要用逗号间隔。如果被调用函数没有定义形参,则在函数调用表达式中不需要实参,但函数名后的括号不能省略。(3)实参可以是常量,也可以是变量。第6章 函数(4)实参与形参不但数目一致,类型也应该相同。如果实参与形参的数据类型不同,则以形参的类型为准,将实参的类型强制转换为形参的类型后,再向形参传递数据。6.1.4 函数间的数据传递函数间的数据传递,指的是主调函数与被调函数之间的数据传递。主调函数通过实参向被调函数传递数据,而被调函数也可以通过返回值向主调函数传递数据,

7、因此,可以认为函数间的数据传递是双向的。无论是由主调函数的实参向被调函数的形参传递数据,还是由被调函数的返回值向主调函数传递数据,均要求数据间的类型匹配、数目一致。通过实参向形参传递数据,不是用实参去替代被调函数的形参,而是将实参的值按顺序逐一赋值给对应的形参变量。因此在被调函数中,形参的改变不会对实参产生影响。这样的传递也称为“值传递”。6.1.5 函数体函数体是为实现函数功能而编写的代码块,由若干条语句组成。函数体可以分为声明部分和语句部分。根据C语言程序“先定义、后使用”的原则,在执行函数体以实现功能的过程中,对于函数需要使用的变量,要首先在函数的声明部分定义,对于函数需要调用的其他函数

8、,也必须进行声明。在函数体中如果调用标准库函数,必须使用#include指令将所需的头文件包含到源程序文件中。如果调用自定义函数,则根据定义被调函数的位置决定是否在主调函数中进行声明。如果被调函数定义在主调函数之前,则无需声明可以直接调用被调第6章 函数函数;如果被调函数定义在主调函数之后,则需要在主调函数的声明部分对被调函数进行声明。在结构化程序设计的初始阶段,可以先确定为解决问题而需要的若干功能模块(即函数),以及相互间的调用关系,然后再逐一为这些模块描述具体的功能(即函数体)。通常的做法是先以空函数的形式出现,并以函数名来标识该函数将来需要实现的功能。空函数由函数首部和一对花括号组成,即

9、函数体内为空,留待以后添加语句实现功能。调用空函数并不影响程序的正常执行,只不过空函数不实现任何功能而已。6.1.6 函数的定义与函数的声明函数的定义是确定函数功能的过程,包括定义函数名、返回值类型、形参及其类型、函数体四个部分。在程序中,所有函数都是平行的关系,定义函数时是分别进行、相互独立的。一个函数并不从属于另一个函数,不能定义在另一个函数体内,即函数不能嵌套定义。函数的声明类似于变量的定义,需要预先了解被调函数的返回值类型、函数名、参数个数及参数类型等信息,以便主调函数能够使用被调函数。至于被调函数的功能如何实现则与主调函数无关。由此可见,对于函数的声明,只需要函数首部即可。函数声明是

10、一条语句,需要以“;”来标识声明语句的结束。第6章 函数6.2 函数的调用第6章 函数6.2.1 函数的常规调用在本节之前接触到的所有函数调用的示例都属于常规调用。常规调用主要包括以下三种形式:(1)函数调用语句。被调函数由于仅完成特定的操作而无返回值,所以可以单独作为一条语句使用。(2)函数表达式。函数调用作为语句的一部分,当被调函数的返回值传递给主调函数并参与后续运算时,则将其作为赋值语句的组成部分。(3)函数参数。该形式将函数调用直接作为函数的实参。6.2.2 函数的嵌套调用虽然函数的定义是平行的、相互独立的,不能嵌套定义函数,但是允许嵌套调用函数。函数的嵌套调用的一般流程如图6-1所示

11、。第6章 函数(1)程序由main函数开始,并依次执行函数体内语句;(2)执行调用sub1函数的语句,程序流程转向sub1函数;(3)在sub1函数,依次执行其函数体内语句;(4)在sub1函数体内执行调用sub2函数的语句,程序流程转向sub2函数;(5)在sub2函数,依次执行函数体内语句;(6)sub2函数体内语句执行完毕,结束对sub2函数的调用,流程返回至sub1函数调用sub2函数结束的位置;(7)继续依次执行sub1函数体内后续的语句;(8)sub1函数体内语句执行完毕,结束对sub1函数的调用,流程返回至main函数调用sub1函数结束的位置;(9)继续依次执行main函数体内

12、后续的语句,直到main函数结束,程序执行完毕。6.2.3 函数的递归调用函数的常规调用和嵌套调用,其调用流程都是线性的,即不会出现调用环路。递归调用是指一个函数直接或间接地调用该函数本身,如图6-2所示。递归函数的概念来源于数学领域函数的递归定义。第6章 函数6.3 数组与函数第6章 函数使用数组元素作函数参数时,实参为数组元素,形参为变量,是将数组元素的值传递给形参变量;使用数组名作函数参数时,实参为数组名,形参则相应地定义为数组,是将实参数组的首地址(即数组名)传递给形参数组。6.3.1 数组元素作函数实参以常量、变量以及表达式作函数实参,是将实参的值赋值给形参变量,这样的数据传递是单向

13、的值传递。数组元素也可以看作特定数据类型的单一个体,因此以数组元素作函数实参,其用法与使用变量作函数实参相同,也是将数组元素的值赋值给形参变量,同样为单向的值传递。6.3.2 数组名作函数实参数组名是数组首元素的地址,因此使用数组名作函数实参时,不是在传递数组元素的值,而是在传递数组存储单元的起始地址。使用数组名作函数实参时,被调函数的形参不能定义为基本类型变量,一种可行的方法是将其定义为形参数组,并且与实参数组的类型一致。在函数调用时,将实参数组的起始地址传递给形参数组,使得两个数组的起始地址相同,即实参数组和形参数组共同使用同一段存储单元。由于实参数组和形参数组的类型相同,起始地址也相同,

14、因此在被调函数中针对形参数组所做的任何改变,实际上就是针对实参数组的改变。由于数据的传递是通过传递地址实现的,这种方式也称作“地址传递”。通过地址传递,可以使被调函数直接引用实参数组元素。需要注意的是,C语言编译系统对形参数组的大小不做检查,只是将实参数组首元素的地址传递给形参数组。因此在被调函数中可以不声明形参数组的大小,甚至可以声明形参数组与实参数组的大小不一致。第6章 函数6.4 变量的作用域第6章 函数变量的作用域决定了变量的有效范围,即变量在什么范围内可以被引用。从作用域的角度来看,变量可以分为全局变量和局部变量。6.5.1 局部变量局部变量也称内部变量,包括函数内定义的变量、函数的

15、形式参数以及在函数内的复合语句中定义的变量。函数内定义的变量以及函数的形式参数,其有效性被限制在本函数内;同理,复合语句中定义的变量只能在本复合语句中被引用。6.5.2 全局变量在函数外定义的变量是全局变量,也称外部变量。全局变量的有效范围从定义变量的位置开始到所在的源文件结束,可以被本源文件内所有的函数引用。针对变量的定义和引用,有如下的一般规则:第6章 函数(1)在同一作用域中,不允许存在同名的变量。(2)在没有包含关系的不同作用域中,同名的变量相互独立,互不影响。(3)若在具有包含关系的不同作用域中存在同名变量,则外层变量在内层中不可见,即在内层中被引用的是作用域小的变量。合理地使用全局

16、变量,可以增加函数间数据联系的渠道。但如非必需,尽量不要使用全局变量,原因在于:(1)全局变量在程序的整个执行过程中始终占用存储单元。(2)函数引用全局变量会降低函数的通用性。(3)使用全局变量过多,会降低程序的清晰性,较难判断出每个瞬时各外部变量的值。第6章 函数6.5 变量的生存期第6章 函数变量的生存期决定了变量存在的时间,即变量在什么时间内具有存储空间。一个变量如果不存在,肯定无法被引用;一个变量即使存在,也未必总是能被引用。所以,变量的作用域与生存期之间存在一定的联系,但两者并非是完全一一对应的关系。变量的生存期由变量的存储方式决定,包括静态存储方式和动态存储方式。动态存储方式是在程

17、序运行期间根据需要进行动态地分配存储空间的方式,变量临时存放在动态存储区中,直到作用域结束。静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式,变量永久存放在静态存储区中,直到程序结束。定义变量,实际上就是一个申请存储空间的过程。我们需要告诉计算机在哪里开辟多大的存储单元。所以在定义变量时需要说明该变量的两个属性:数据类型和存储类别。数据类型前面已经学过,而存储类别具体包括4种,即自动的(auto)、静态的(static)、寄存器的(register)以及外部的(extern)。1动态存储区的变量用关键字auto声明的局部变量称为自动变量。自动变量存放在动态存储区中,系统在调用函数时

18、给函数内的自动变量分配存储空间,函数调用结束时自动释放这些存储空间。在定义局部变量时,如不指明存储类别,系统默认作自动变量处理。也可以说,未用static声明的局部变量都是自动变量。2静态存储区的变量全局变量和用static声明的局部变量存放在静态存储区,在程序执行过程中占据固定的存储单元,直到程序执行完毕才被释放。第6章 函数动态存储区的变量在函数调用时赋值,每调用一次函数,重新赋一次初值,相当于执行一次赋值语句。静态存储区的变量在编译时赋初值,即只赋初值一次,在程序运行时它已有初值;以后每次调用函数时不再重新赋值,而只是保留上次函数调用结束时的值。动态存储区的变量若不赋初值,存储单元内的值

19、是不确定的;静态存储区的变量若不赋初值,系统将自动为其赋值0。同为静态存储区的变量,全局变量可以被所有函数引用,而静态局部变量虽然在本函数调用结束后仍然存在,但不能被其他函数引用。3寄存器变量用关键字register声明的自动变量称为寄存器变量。一般情况下,程序由控制器发出指令将内存中变量的值送到运算器中计算,如果需要存数,再从运算器中将数据送到存储器存放。由于系统对寄存器的存取速度远高于对内存的存取速度,因此,如果一个自动变量使用频繁(例如:10000次循环的控制变量),为提高执行效率,C语言允许将该自动变量的值放在CPU的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中存取。现在

20、的编译系统能够自动识别使用频繁的局部动态变量,从而自动将这些变量放在寄存器中。因此使用register定义变量实际是没有必要的,但要清楚该变量的含义。第6章 函数4外部变量全局变量的有效范围是从定义变量的位置开始到本源文件结束,可以被该范围内的所有函数引用。用extern对全局变量进行声明,可以扩展该全局变量的作用范围。在声明外部变量时可以省略该变量的类型名,因为此时是在引用一个已经定义了数据类型的外部变量。声明变量有两种情况:(1)需要建立存储空间的(如“int a;”)为“定义性声明”,简称“定义”。(2)不需要建立存储空间的(如“extern a;”)为“引用性声明”,简称“声明”。声明

21、包括定义,但并非所有的声明都是定义。5存储类别小结如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域,如图6-4所示。如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期,如图6-5所示。作用域是从空间的角度区分变量的,生存期是从时间的角度区分变量的,二者有联系但不是一回事。第6章 函数局部变量默认为动态存储,用static声明后,该变量才被存储在静态存储区中。全局变量全部是静态存储,用static声明后,该变量的作用域被限于本文件中。使用auto、register、static声明变量的存储类别,是在定义变量的时候,此时不能省略变量的数据类型。使用extern声明变量的存储类别,是在引用已定义变量的时候,此时可以省略变量的数据类型。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《高级语言程序设计》课件第6章函数.pptx)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|