工信版(中职)编程语言基础——C语言模块5教学课件.ppt

上传人:春哥&#****71; 文档编号:90587214 上传时间:2023-05-16 格式:PPT 页数:86 大小:1.70MB
返回 下载 相关 举报
工信版(中职)编程语言基础——C语言模块5教学课件.ppt_第1页
第1页 / 共86页
工信版(中职)编程语言基础——C语言模块5教学课件.ppt_第2页
第2页 / 共86页
点击查看更多>>
资源描述

《工信版(中职)编程语言基础——C语言模块5教学课件.ppt》由会员分享,可在线阅读,更多相关《工信版(中职)编程语言基础——C语言模块5教学课件.ppt(86页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、YCF(中职)编程语言基础C语言模块5教学课件模块模块5函数函数任务任务1 函数概述函数概述任务任务2 函数的调用函数的调用任务任务3 函数的参数传递函数的参数传递任务任务4 函数的返回与返回值的传递函数的返回与返回值的传递任务任务5 用数组作为函数参数用数组作为函数参数任务任务6 字符串参数的传递字符串参数的传递任务任务7 变量的作用域和生存期变量的作用域和生存期任务任务1函数概述函数概述5.1.1 函数定义函数定义函数定义的一般形式为函数定义的一般形式为:(1)类型是函数的类型,也是该函数返回值的数据类型。类型是函数的类型,也是该函数返回值的数据类型。(2)函数名是标识符,可由用户指定。函

2、数名是标识符,可由用户指定。(3)参数表部分可有可无。参数表部分可有可无。(4)函数中由最外一层函数中由最外一层”括起的部分为函数体,包括变量括起的部分为函数体,包括变量说明和语句,其中变量说明可有可无,语句也可有可无。说明和语句,其中变量说明可有可无,语句也可有可无。下一页返回任务任务1函数概述函数概述【例例5-1】函数定义的一个实例。函数定义的一个实例。上一页返回下一页任务任务1函数概述函数概述5.1.2 函数的说明函数的说明在函数中调用某函数之前应对被调用函数进行说明,这与使在函数中调用某函数之前应对被调用函数进行说明,这与使用变量之前要先进行变量说明是一样的。在调用函数中对被用变量之前

3、要先进行变量说明是一样的。在调用函数中对被调用函数作说明的目的是使编译系统知道被调用函数返回值调用函数作说明的目的是使编译系统知道被调用函数返回值的类型,以便在调用函数中按此种类型对返回值作相应的处的类型,以便在调用函数中按此种类型对返回值作相应的处理。理。对被调用函数的说明也有两种格式,一种为传统方式,其一对被调用函数的说明也有两种格式,一种为传统方式,其一般格式为般格式为:类型说明符被调用函数名类型说明符被调用函数名();这种格式只给出函数返回值的类型,被调用函数名及一个空这种格式只给出函数返回值的类型,被调用函数名及一个空括号。由于在括号中没有任何参数信息,因此不便于编译系括号。由于在括

4、号中没有任何参数信息,因此不便于编译系统对错误进行检查,易发生错误。统对错误进行检查,易发生错误。上一页返回下一页任务任务1函数概述函数概述另一种为现代方式,其一般格式为另一种为现代方式,其一般格式为:类型说明符被调用函数名类型说明符被调用函数名(类型形参,类型形参类型形参,类型形参)或类型说或类型说明符被调用函数名明符被调用函数名(类型,类型类型,类型);现代格式的括号内给出了形参的类型和形参名,或只给出形现代格式的括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。参类型。这便于编译系统进行检错,以防止可能出现的错误。C语言中规定在以下几种情况时

5、,可以省去调用函数中对被调语言中规定在以下几种情况时,可以省去调用函数中对被调用函数的说明。用函数的说明。(1)如果被调用函数的返回值是整型或字符型时,可以不对如果被调用函数的返回值是整型或字符型时,可以不对被调用函数作说明,而直接调用。这时系统将自动对被调用被调用函数作说明,而直接调用。这时系统将自动对被调用函数返回值按整型处理。函数返回值按整型处理。(2)当被调用函数的函数定义出现在调用函数之前时,在调当被调用函数的函数定义出现在调用函数之前时,在调用函数中也可以不对被调用函数作说明而直接调用。用函数中也可以不对被调用函数作说明而直接调用。上一页返回下一页任务任务1函数概述函数概述(3)如

6、在所有函数定义之前,在函数外预先说明了各个函数如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各调用函数中,可不再对被调用函数作的类型,则在以后的各调用函数中,可不再对被调用函数作说明。例如说明。例如:上一页返回下一页任务任务1函数概述函数概述5.1.3 函数的介类函数的介类从用户的使用角度看,函数有两种从用户的使用角度看,函数有两种:标准函数标准函数(或库函数或库函数)和用和用户自定义函数。户自定义函数。1.标准函数标准函数(或库函数或库函数)库函数是系统已经编好的函数,一个库函数就能实现一个特库函数是系统已经编好的函数,一个库函数就能实现一个特定的功能。定的功能。C语言包

7、括了丰富的库函数,详细情况见附录。关语言包括了丰富的库函数,详细情况见附录。关于库函数有以下几点说明。于库函数有以下几点说明。调用标准库函数时要使用调用标准库函数时要使用include命令,例如命令,例如:#include 对于每一类库函数,附录中都列出了在调用该类库函数时,对于每一类库函数,附录中都列出了在调用该类库函数时,用户在源程序用户在源程序include命令中应该包含的头文件名。命令中应该包含的头文件名。上一页返回下一页任务任务1函数概述函数概述调用数学库函数时,要用到以下的命令调用数学库函数时,要用到以下的命令:调用字符调用字符(串串)函数时,要用到以下的命令函数时,要用到以下的命

8、令:2.用户自己定义的函数用户自己定义的函数这种函数由用户自己编写,主要用于执行特定的功能,缩写这种函数由用户自己编写,主要用于执行特定的功能,缩写用户自定义函数是使用用户自定义函数是使用C语言进行程序设计的重点。此外,从语言进行程序设计的重点。此外,从函数的形式来看,函数还可以分为无参函数和有参函数两种,函数的形式来看,函数还可以分为无参函数和有参函数两种,这两种函数的详细情况将在后面介绍。这两种函数的详细情况将在后面介绍。上一页返回任务任务2函数的调用函数的调用5.2.1 函数调用的方式函数调用的方式在在C语言中,可以用以下几种方式调用函数语言中,可以用以下几种方式调用函数:函数表达式函数

9、表达式:函数作为表达式中的一项出现在表达式中,以函函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值数返回值参与表达式的运算。这种方式要求函数是有返回值的。的。函数语句函数语句:函数调用的一般形式加上分号即构成函数语句。函数调用的一般形式加上分号即构成函数语句。函数实参函数实参:函数作为另一个函数调用的实际参数出现。这种情函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。必须是有返回值的。返回下一页任务任务2函数的调用函数的调用5.2.

10、2 函数的嵌套调用函数的嵌套调用C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是不存在上一级函数和下一级函数的问题。但是C语言允许在一语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其他函数。这与其他数的嵌套调用。即在被调函数中又调用其他函数。这与其他语言的子程序嵌套的情形是类似的。其关系可如语言的子程序嵌套的情形是类似的。其关系可如图图5-1所示。所示。图图5-1表示了两层嵌套的情形。其执行

11、过程是表示了两层嵌套的情形。其执行过程是:执行执行main函函数中调用数中调用a函数的语句时,即转去执行函数的语句时,即转去执行a函数,在函数,在a函数中调函数中调用用b函数时,又转去执行函数时,又转去执行b函数,函数,b函数执行完毕返回函数执行完毕返回a函数函数的断点继纯执行的断点继纯执行.a函数执行完毕返回函数执行完毕返回main函数的断点继纯函数的断点继纯执行。执行。上一页返回下一页任务任务2函数的调用函数的调用上一页返回下一页任务任务2函数的调用函数的调用用用图图5-2表示求函数值表示求函数值s的嵌套调用。的嵌套调用。上一页返回下一页任务任务2函数的调用函数的调用5.2.3 函数的递归

12、调用函数的递归调用一个函数在它的函数体内直接或间接调用它自身称为递归调一个函数在它的函数体内直接或间接调用它自身称为递归调用。这种函数称为递归函数。用。这种函数称为递归函数。c语言允许函数的递归调用。递语言允许函数的递归调用。递归调用有直接递归和间接递归两种。所谓直接递归是指函数归调用有直接递归和间接递归两种。所谓直接递归是指函数f直接调用自身,即主调函数也是被调函数。而间接递归是指直接调用自身,即主调函数也是被调函数。而间接递归是指函数函数f1通过另一个函数通过另一个函数f2去掉用去掉用f1。直接递归和间接递归调。直接递归和间接递归调用的示意图如用的示意图如图图5-3和和图图5-4所示。所示

13、。上一页返回下一页任务任务2函数的调用函数的调用例如,有函数例如,有函数f如下如下上一页返回下一页任务任务2函数的调用函数的调用【例例5-3】用递归法计算用递归法计算n!。用递归法计算用递归法计算n!可用下述公式表示可用下述公式表示:按公式可编程如下按公式可编程如下:上一页返回下一页任务任务2函数的调用函数的调用上述递归调用和回推赋值借助于堆栈形象地用上述递归调用和回推赋值借助于堆栈形象地用图图5-5表示。表示。上一页返回任务任务3函数的参数传递函数的参数传递5.1.3 参数的值传送方式参数的值传送方式上面已介绍,上面已介绍,c语言本身是采用传值方式传送参数的。在函数被调语言本身是采用传值方式

14、传送参数的。在函数被调用时,系统为每个形式参数变量分配存储单元,同时将对应的实用时,系统为每个形式参数变量分配存储单元,同时将对应的实际参数值存储在这些单元里。也就是说,这些单元中的初值就是际参数值存储在这些单元里。也就是说,这些单元中的初值就是对应实参的值,所以,被调用函数中的形参变量所接收的是实参对应实参的值,所以,被调用函数中的形参变量所接收的是实参的一个临时副本,而不是实参的地址。使用传值方式时,尽管函的一个临时副本,而不是实参的地址。使用传值方式时,尽管函数内形参变量的值在函数调用过程中发生变化,但它对应的实参数内形参变量的值在函数调用过程中发生变化,但它对应的实参变量的值却不受任何

15、影响,这是因为实参变量和形参变量所分配变量的值却不受任何影响,这是因为实参变量和形参变量所分配的存储单元是不同的。调用函数时,形参的值只是被复制到实参的存储单元是不同的。调用函数时,形参的值只是被复制到实参所占用的内存单元中,所以实参变量值的变化也就不会造成形参所占用的内存单元中,所以实参变量值的变化也就不会造成形参变量值的改变。所以,形参变量实际是一个局部变量,仅在定义变量值的改变。所以,形参变量实际是一个局部变量,仅在定义它的函数内有意义,一旦函数执行完毕,形参变量所占有存储单它的函数内有意义,一旦函数执行完毕,形参变量所占有存储单元中的值也不再保留。请看下面的例题。元中的值也不再保留。请

16、看下面的例题。上一页返回下一页任务任务3函数的参数传递函数的参数传递上一页返回下一页任务任务3函数的参数传递函数的参数传递5.3.2 参数的地址传送方式参数的地址传送方式经过上面的讨论可以知道,采用传值方式传送参数,不影响经过上面的讨论可以知道,采用传值方式传送参数,不影响实参变量的值,这对于某些问题来说是十分必要的。如果在实参变量的值,这对于某些问题来说是十分必要的。如果在调用函数时需要改变实参变量的值,则利用传值方式传送参调用函数时需要改变实参变量的值,则利用传值方式传送参数是难以达到改变实参变量的目的,请看下面的数据交换函数是难以达到改变实参变量的目的,请看下面的数据交换函数。数。上一页

17、返回下一页任务任务3函数的参数传递函数的参数传递【例例5-5】编写一个数据交换函数编写一个数据交换函数swap(a,b),并调用该,并调用该 函数将函数将x,y两个变量的值进行交换。两个变量的值进行交换。程序运行结果程序运行结果上一页返回下一页任务任务3函数的参数传递函数的参数传递从结果可知,变量从结果可知,变量x,y的值并没有被交换,还是与输入时相同。的值并没有被交换,还是与输入时相同。在调用函数在调用函数swap(x,y)时,只是将变量时,只是将变量x,y的值传给函数中的值传给函数中的参数变量的参数变量a,b,其实交换的只是形参变量,其实交换的只是形参变量a和和b,并没有将,并没有将x,y

18、的值进行交换。在这个例子中,语句的值进行交换。在这个例子中,语句”swap(x,Y)”;等价于下面的复合语句等价于下面的复合语句:上一页返回下一页任务任务3函数的参数传递函数的参数传递要达到要达到X,y值互换的目的,必须采取传址方式传送参数,此值互换的目的,必须采取传址方式传送参数,此种方式要求传送实际参数的地址而不是它的值。在这种情况种方式要求传送实际参数的地址而不是它的值。在这种情况下,形参必须是能接收地址的指针变量,实际参数为地址量,下,形参必须是能接收地址的指针变量,实际参数为地址量,因此,如果将上例中的函数因此,如果将上例中的函数swap()改写为改写为:上一页返回下一页任务任务3函

19、数的参数传递函数的参数传递而函数调用语句改写为而函数调用语句改写为运行程序,则结果成为运行程序,则结果成为:上一页返回下一页任务任务3函数的参数传递函数的参数传递由于由于Pa,Pb指针中分别存放了指针中分别存放了x,y的地址,所以的地址,所以*pa,*pb分分别代表别代表x,y,这就达到了,这就达到了x,y互换的目的,此时调用语句互换的目的,此时调用语句”swap(&x,&y)”;的执行等价于下面的复合语句的执行等价于下面的复合语句:上一页返回任务任务4函数的返回与返回值的传递函数的返回与返回值的传递5.4.1 无值返回无值返回为了明确函数不返回值,可用关键字为了明确函数不返回值,可用关键字v

20、oid定义函数。定义函数。例如例如在无返回值的函数定义中也可以使用在无返回值的函数定义中也可以使用return语句进行返回,语句进行返回,此时,此时,return语句中不带返回值。语句中不带返回值。返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递【例例5-6】定义一个函数,将三个不相等的整数按照它们的定义一个函数,将三个不相等的整数按照它们的值由大到小的顺序输出来。值由大到小的顺序输出来。上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递上一页返回下一页任务任务4函数的返回与返

21、回值的传递函数的返回与返回值的传递5.4.2 使用使用return语句传递返回值语句传递返回值当实参将参数值传给形参后,即可执行该函数应的操作,函当实参将参数值传给形参后,即可执行该函数应的操作,函数的执行情况主要有以下两种。数的执行情况主要有以下两种。在函数中完成一些打印操作和信息显示输出等任务,不需要在函数中完成一些打印操作和信息显示输出等任务,不需要返回结果给主调函数,这类函数的类型为返回结果给主调函数,这类函数的类型为void。在执行相应的函数操作后,还要将函数运行结果返回给主调在执行相应的函数操作后,还要将函数运行结果返回给主调函数,主调函数使用返回值作进一步运算。这类函数带有返函数

22、,主调函数使用返回值作进一步运算。这类函数带有返回值。要使回值。要使1个函数返回个函数返回1个确定的值,就必须要用个确定的值,就必须要用return语句。语句。上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递1.return语句的使用格式语句的使用格式在以前的例子中已经用到了在以前的例子中已经用到了return语句,语句,return语句的格语句的格式如下式如下:上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递2.使用说明使用说明对对return语句的用法作如下说明。语句的用法作如下说明。return语句中的语句中的“表达式表达式”的值就是函

23、数返回给主调函数的的值就是函数返回给主调函数的值。值。当程序执行到当程序执行到return语句时,立即退出函数的执行返回主调语句时,立即退出函数的执行返回主调函数。一个函数中可以函数。一个函数中可以 包含多个包含多个return语句,但是在语句,但是在1次次函数调用中只会有函数调用中只会有1个被执行。个被执行。return语句中也可以不包含表达式,其作用只是使流程返回语句中也可以不包含表达式,其作用只是使流程返回主调函数,这时并不返回确定的值。如果函数不需要返回值,主调函数,这时并不返回确定的值。如果函数不需要返回值,则可以在定义函数时使用则可以在定义函数时使用void类型。类型。上一页返回下

24、一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递函数要返回值必须具有函数要返回值必须具有1个确定的类型。例如个确定的类型。例如1个函数可以返个函数可以返回一个整型、实型或字符型的数值。这主要在函数定义时在回一个整型、实型或字符型的数值。这主要在函数定义时在通过类型标识符指定。通过类型标识符指定。函数的返回值必须与函数定义的函数的返回值必须与函数定义的“类型标识符类型标识符”一致或者兼一致或者兼容,若类型不一致,则以容,若类型不一致,则以函数的类型标识为准进行转换,返回函数的类型标识为准进行转换,返回1个与函数的类型标识符个与函数的类型标识符一致的值。建议尽量使其一致,避免系统的自

25、动转换和人为一致的值。建议尽量使其一致,避免系统的自动转换和人为所造成的数据误差或者错误。所造成的数据误差或者错误。上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递注意注意:函数的函数的“类型标识符类型标识符”与函数的参数类型没有必然的联与函数的参数类型没有必然的联系,例如系,例如:上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递 3.应用举例应用举例【例例5-7】试编程打印试编程打印1001000之间的水仙花数。水仙花之间的水仙花数。水仙花各位数的立方和就等于该数。各位数的立方和就等于该数。上一页返回下一页任务任务4函数的返回与返回值的传递

26、函数的返回与返回值的传递上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递【例例5-8】从键盘上输入一个字符,将其中大于字符的字符从键盘上输入一个字符,将其中大于字符的字符输出。输出。上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递【例例5-9】从键盘上输入两个实数,然后比较这两个实数和从键盘上输入两个实数,然后比较这两个实数和与积的大小,输出其中较大者。与积的大小,输出其中较大者。上一页返回任务任务5用数组作为函数参数用数组作为函数参数5.5.1 数组元素作为函数参数数组元素作为函数参数数组元素的使用与普通变量相同,因此数组元素作为函数参数组

27、元素的使用与普通变量相同,因此数组元素作为函数参数和简单变量作为函数参数的用法完全相同,也是单向值传数和简单变量作为函数参数的用法完全相同,也是单向值传递。递。【例例5-10】统计统计30名学生成绩分布情况。大于等于名学生成绩分布情况。大于等于90分为分为优,大于等于优,大于等于80分为良,大于等于分为良,大于等于70分为中,大于等于分为中,大于等于60分为及格,小于分为及格,小于60分为差。分为差。返回下一页任务任务5用数组作为函数参数用数组作为函数参数上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数上一页返回下一页

28、任务任务5用数组作为函数参数用数组作为函数参数5.5.2 数组名作为函数参数数组名作为函数参数数组名作为函数参数时,需要分别在被调函数与主调函数中数组名作为函数参数时,需要分别在被调函数与主调函数中说明数组类型,并且要求实参与形参数组的类型相同,维数说明数组类型,并且要求实参与形参数组的类型相同,维数相同。在进行参数传递时是相同。在进行参数传递时是“地址传递地址传递”,也就是说,将实,也就是说,将实参数组的起始地址传递给了形参数组,而不是将实参数组中参数组的起始地址传递给了形参数组,而不是将实参数组中的每一个元素一一传递给形参数组元素。的每一个元素一一传递给形参数组元素。1.一维数组名作为函数

29、参数一维数组名作为函数参数一维数组名作为函数参数的语法格式如下一维数组名作为函数参数的语法格式如下:上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数以下为在主函数中向,以下为在主函数中向,disp()传递一个一维数组的语法传递一个一维数组的语法:上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数2.二维数组名作为函数参数二维数组名作为函数参数二维数组名作为函数参数的语法格式如下二维数组名作为函数参数的语法格式如下:上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数以下为在主函数中向,以下为在主函

30、数中向,disp()传递一个二维数组的语法传递一个二维数组的语法:上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数【例例5-11】编程完成对一个编程完成对一个3 x4矩阵的输入,并将该矩阵矩阵的输入,并将该矩阵乘以乘以2输出,要求输入和输出在不同的函数中进行。输出,要求输入和输出在不同的函数中进行。上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数上一页返回下一页任务任务5用数组作为函数参数用数组作为函数参数数组名作为函数参数时应该注意的几个问题数组名作为函数参数时应该注意的几个问题:(1)实参和形参类型要一致,包括维数相同、元素类型相同。实参和形参类型要一致,包括维

31、数相同、元素类型相同。(2)实参数组和形参数组大小可以不一致,如果要得到实参实参数组和形参数组大小可以不一致,如果要得到实参的全部元素,则形参数组应大于等于实参数组大小。的全部元素,则形参数组应大于等于实参数组大小。(3)一维数组作参数时,形参可不指定大小,在定义形参数一维数组作参数时,形参可不指定大小,在定义形参数组时,只需在数组名后跟一个空的方括号组时,只需在数组名后跟一个空的方括号;对于二维和多维数对于二维和多维数组,其形参中只有第组,其形参中只有第1维的大小可以省略,其余维数必须给出。维的大小可以省略,其余维数必须给出。(4)数组名作为函数参数,实际上传递的是数组的起始地址,数组名作为

32、函数参数,实际上传递的是数组的起始地址,这样实参和形参共享一段内存空间。这样实参和形参共享一段内存空间。上一页返回任务任务6字符串参数的传递字符串参数的传递【例例5-12】编写求字符串长度的函数,并利用它求字符串的编写求字符串长度的函数,并利用它求字符串的长度。长度。返回下一页任务任务6字符串参数的传递字符串参数的传递上一页返回任务任务7变量的作用域和生存期变量的作用域和生存期5.7.1 变量的作用域和生存期变量的作用域和生存期在在C语言程序中,不同函数中的变量可以同名,这些同名的变语言程序中,不同函数中的变量可以同名,这些同名的变量分别代表内存中不同的存储空间,因此,编写程序时应注量分别代表

33、内存中不同的存储空间,因此,编写程序时应注意区分这些变量,仔细分析在程序运行某个具体时刻是哪个意区分这些变量,仔细分析在程序运行某个具体时刻是哪个具体的变量在起作用具体的变量在起作用(如例如例5-13)返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期1.局部变量局部变量局部变量也称内部变量,是指在函数内部或复合语句内定义局部变量也称内部变量,是指在函数内部或复合语句内定义的变量,它只在该函数或复合语句内有效。也就是说,只有的变量,它只在该函数或复合语句内有效。也就是说,只有在包含变量说明的函数内部或复合语句中,才能使

34、用被说的在包含变量说明的函数内部或复合语句中,才能使用被说的变量,在此之外就不能使用这些变量。如例变量,在此之外就不能使用这些变量。如例5-14上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期说明说明:main函数中定义的局部变量,只能函数中定义的局部变量,只能main在函数中起作用,在函数中起作用,在其他函数中不起作用。同样,在在其他函数中不起作用。同样,在main函数中也不能直接函数中也不能直接使用其他函数定义的局部变量。使用其他函数定义的局部变量。函数的形参变量是局部变量,只在被调用函数内有效。函数的形参

35、变量是局部变量,只在被调用函数内有效。允许在不同的函数中使用相同的变量名,分别代表不同的对允许在不同的函数中使用相同的变量名,分别代表不同的对象,分配不同的存储单元,互不干扰。象,分配不同的存储单元,互不干扰。在复合语句中可定义变量,其作用域只在该复合语句范围内。在复合语句中可定义变量,其作用域只在该复合语句范围内。上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期1.全局变量全局变量全局变量也称外部变量,是指在函数之外定义的变量,可以全局变量也称外部变量,是指在函数之外定义的变量,可以为本文件中其他函数所共用,其有效范围是从定义变量的位为本文件中其他函数所共用,其有效范围是从

36、定义变量的位置开始到本源文件结束。如例置开始到本源文件结束。如例5-15上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期说明说明:全局变量可加强函数模块之间的数据联系,但过度使用全全局变量可加强函数模块之间的数据联系,但过度使用全局变量将降低函数的独立性,如果在一个函数中改变了全局局变量将降低函数的独立性,如果在一个函数中改变了全局变量的值,就会影响到其他函数,从模块化程序设计的观点变量的值,就会影响到其他函数,从模块化程序设计的观点来看这是不利的,因此在程序中应尽量少使用全局变量。来看这是不利的,因此在程序中

37、应尽量少使用全局变量。由于函数调用只能带回一个返回值,有时可以利用全局变由于函数调用只能带回一个返回值,有时可以利用全局变量从被调函数处得到一个以上的返回值。量从被调函数处得到一个以上的返回值。全局变量如果未初始化,系统将自动赋值为全局变量如果未初始化,系统将自动赋值为0。在同一源文件中,允许全局变量和局部变量同名。在局部在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量将暂时被屏蔽而不起作用。变量的作用域内,全局变量将暂时被屏蔽而不起作用。上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期例例5-16程序如下程序如下:上一页返回下一页任务任务7变量的作

38、用域和生存期变量的作用域和生存期上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期5.7.2 变量的存储类别变量的存储类别在在C语言中,变量和函数有两个属性语言中,变量和函数有两个属性:即数据类型和存储类别。即数据类型和存储类别。变量的存储类别是指变量在内存中的存储方法。变量的存储类别是指变量在内存中的存储方法。c语言系统将语言系统将变量的存储类别分成了变量的存储类别分成了4种种:自动变量自动变量(auto)、静态变量、静态变量(static)、寄存器变量、寄存器变量(register)和外部变量和外部变量(extern)1.自动变量自动变量出现范围出现范围:出现在函数内部。出

39、现在函数内部。判别方法判别方法:定义在函数内部并且缺省存储类别说明的变量或定义在函数内部并且缺省存储类别说明的变量或在直接用在直接用auto显式说明的变量。显式说明的变量。作用域作用域:定义该变量的函数。定义该变量的函数。生存期生存期:定义该变量的函数被执行的期间。定义该变量的函数被执行的期间。上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期自动变量完整的定义形式如下自动变量完整的定义形式如下:Auto 类型说明符类型说明符 变量名变量名;注意注意:自动变量一般都会省略自动变量一般都会省略auto,函数中的大多数变量都是自,函数中的大多数变量都是自动变量。例如动变量。例如:上

40、一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期形参和复合语句里定义的变量是自动变量。形参和复合语句里定义的变量是自动变量。自动变量一旦被定义说明,则只能在说明该变量的函数或自动变量一旦被定义说明,则只能在说明该变量的函数或复合语句中才有效,离开了上述区域则无效。复合语句中才有效,离开了上述区域则无效。自动变量的生存期只限于相应函数或复合语句被执行的过自动变量的生存期只限于相应函数或复合语句被执行的过程,若变量是定义在复合语句内,则其生存期为该复合语句程,若变量是定义在复合语句内,则其生存期为该复合语句被执行的期间。被执行的期间。上一页返回下一页任务任务7变量的作用域和生存期变

41、量的作用域和生存期例例5-17程序如下程序如下:上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期程序运行结果如下程序运行结果如下:1 1上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期2.静态变量静态变量(static变量变量)静态变量分成静态局部变量和静态全局变量。静态变量分成静态局部变量和静态全局变量。静态变量的定义形式如下静态变量的定义形式如下:Static 类型说明符类型说明符 变量名变量名 (1)静态局部变量静态局部变量 出现范围出现范围:可以出现在函数内部。可以出现在函数内部。判别方法判别方法:定义在函数内部,并且用定义在函数内部,并且用stat

42、ic显式说明。显式说明。作用域作用域:定义该变量的函数。定义该变量的函数。生存期生存期:整个程序的执行期。整个程序的执行期。上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期例例5-18用静态变量编程,求用静态变量编程,求15的阶乘。的阶乘。程序如下程序如下:上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期注意注意静态局部变量的作用域在定义该变量的函数内,生存期是静态局部变量的作用域在定义该变量的函数内,生存期是整个程序的执行期。要改变该变量的值,必须在定义该变量整个程序的执行期。要改变该变量的值,必须在定义该变量的函数内部完成,相对于外部变量而言,静态变量更

43、安全,的函数内部完成,相对于外部变量而言,静态变量更安全,起到了信息屏蔽的作用,因此,静态局部变量的应用比较广起到了信息屏蔽的作用,因此,静态局部变量的应用比较广泛。泛。静态变量初始化语句只在第一次调用该函数时才执行,以静态变量初始化语句只在第一次调用该函数时才执行,以后每次调用该函数不再执行初始化语句。后每次调用该函数不再执行初始化语句。静态变量如果没有初始化,则系统自动赋初值静态变量如果没有初始化,则系统自动赋初值0或或Null 上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期例例5-19程序如下程序如下:上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期

44、(2)静态全局变量静态全局变量出现范围出现范围:一般出现在函数的外部。一般出现在函数的外部。判别方法判别方法:定义在函数外部,并且用定义在函数外部,并且用static显式说明。显式说明。作用域作用域:从定义该变量的位置直至本源文件结束。从定义该变量的位置直至本源文件结束。生存期生存期:整个程序的执行期。整个程序的执行期。在程序设计中希望某些外部变量只限于被本文件引用,而不在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用,这时可以使用静态全局变量。能被其他文件引用,这时可以使用静态全局变量。上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期例例5-20上一页返

45、回下一页任务任务7变量的作用域和生存期变量的作用域和生存期3.寄存器变量寄存器变量(register变量变量)出现范围出现范围:出现在函数内部。出现在函数内部。判别方法判别方法:定义在函数内部的变量,并且用定义在函数内部的变量,并且用register显式显式说明。说明。作用域作用域:在定义该变量的函数内。在定义该变量的函数内。生存期生存期:定义该变量的函数被执行的过程。定义该变量的函数被执行的过程。寄存器变量不是存放在内存里,而是存放在寄存器变量不是存放在内存里,而是存放在CPU的寄存器里,的寄存器里,其特点是存取速度快,如果变量存取很频繁,比如循环变量,其特点是存取速度快,如果变量存取很频繁

46、,比如循环变量,则可以定义成寄存器变量以提高程序的执行速度。则可以定义成寄存器变量以提高程序的执行速度。寄存器变量的定义形式如下寄存器变量的定义形式如下:Register 类型说明类型说明 符变量名符变量名上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期注意注意:只有自动变量和函数的形参可以作为寄存器变量。只有自动变量和函数的形参可以作为寄存器变量。静态变量和外部变量不能定义为寄存器变量。静态变量和外部变量不能定义为寄存器变量。例例5-21上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期4.外

47、部变量外部变量(extern变量变量)出现范围出现范围:可以出现在程序中的任何说明部分。可以出现在程序中的任何说明部分。判别方法判别方法:定义在函数外部且无其他显式存储类别说明或直定义在函数外部且无其他显式存储类别说明或直接用接用extern显式说明。显式说明。作用域作用域:从定义该变量的位置起直到本文件结束。从定义该变量的位置起直到本文件结束。生存期生存期:整个程序的执行期。整个程序的执行期。上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期例例5-22程序如下程序如下:上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期外部变量说明的一般形式如下外部变量说明的

48、一般形式如下:extern类型说明符变量名类型说明符变量名;外部变量的定义和说明是不同的。定义外部变量时系统会为外部变量的定义和说明是不同的。定义外部变量时系统会为该变量分配存储空间,并且变量的定义只有一次该变量分配存储空间,并且变量的定义只有一次;说明外部变说明外部变量时系统是不会为它分配存储空间的,并且同一个变量的说量时系统是不会为它分配存储空间的,并且同一个变量的说明可以出现在多个地方。明可以出现在多个地方。“说明说明”的作用只是声明该变量是的作用只是声明该变量是一个已在后面定义过的外部变量,因为要提前引用所以作说一个已在后面定义过的外部变量,因为要提前引用所以作说明明;外部变量只能在函数外定义,而外部变量的说明可以在函外部变量只能在函数外定义,而外部变量的说明可以在函数外部,也可以在函数内部。数外部,也可以在函数内部。上一页返回任务任务7变量的作用域和生存期变量的作用域和生存期例例5-23程序如下程序如下:上一页返回下一页任务任务7变量的作用域和生存期变量的作用域和生存期上一页返回图图5-1函数的嵌套调用函数的嵌套调用返回图图5-2 S=22!+32!的嵌套调用的嵌套调用返回图图5-3直接递归调用直接递归调用返回图图5-4间接递归调用间接递归调用返回图图5-5递归调用及堆栈变化示意图递归调用及堆栈变化示意图返回

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

当前位置:首页 > 教育专区 > 高中资料

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

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