函数与作用域课件

上传人:我*** 文档编号:141132648 上传时间:2020-08-04 格式:PPT 页数:18 大小:128KB
返回 下载 相关 举报
函数与作用域课件_第1页
第1页 / 共18页
函数与作用域课件_第2页
第2页 / 共18页
函数与作用域课件_第3页
第3页 / 共18页
函数与作用域课件_第4页
第4页 / 共18页
函数与作用域课件_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《函数与作用域课件》由会员分享,可在线阅读,更多相关《函数与作用域课件(18页珍藏版)》请在金锄头文库上搜索。

1、第7章 函 数,7.1 函数定义的一般形式 7.2 函数调用 7.3 变量及作用域 7.4 内部函数和外部函数,7.1 函数定义的一般形式,7.1.1 函数定义 函数定义的一般形式: 返回类型 函数名(形参列表) 语句 return 合适的数值 函数的定义包括以下几个部分: 1. 返回类型 指定函数返回结果的数据类型。函数返回的数据类型可以是C+中除函数、数组类型之外的任何一个合法的数据类型。如果函数没有返回值,返回类型应该为void。 函数的返回类型不能是数组或者函数类型。 如果确实需要返回数组或者函数类型,可以通过指针指向返回数组的首地址。,2. 函数名 是一个合法的C+标识符号。函数的命

2、名必须遵循一般的标识符命名规则。函数的命名应该尽可能反映函数的功能。 3. 形参列表 在函数名后的小括号里面是函数的形参列表。形参列表可以包含多项,即可以是0个或多个变量组成,用来向函数传递值或者是带回结果。形参列表的项与项之间用逗号隔开,每一项都要由已定义的数据类型和一个变量标识符组成,该变量标识符称为该函数的形式参数,简称形参,形参前面给出的数据类型称为该形参的类型。每个形参的类型可以为任一种数据类型,包括普通类型、指针类型、数组类型、引用类型等。,形参列表不可以省略,如果没有形参,括号里的参数可以空着,也可以在括号里用void关键字表明形参列表为空。 4. 函数体 函数体是放在一对大括号

3、之间的若干条语句,用来实现函数的功能。在函数体里允许有一个或多个return语句,将函数值返回给主调函数。当然,有些函数没有返回值,那么return语句仅仅是将流程返回主调函数。一旦执行到函数中某一个return语句时,return后面的语句就不再执行,直接返回主调函数继续向下执行。,7.1.2 函数声明 在C+中,如果要调用一个函数,在调用它之前,必须对该函数进行声明。函数声明是一条程序语句,由函数返回类型、函数名和形参列表组成,其一般形式为: 返回类型 函数名(形参列表); 函数声明是一条程序语句,必须以分号结束。函数声明也称为函数原型。 函数声明主要是向编译器提供函数相关的的信息以便于编

4、译器在函数调用时检查参数类型是否一致、以及返回类型是否匹配等。 正因为函数声明是给编译器提供一些信息,所以在函数声明中,函数的形参的名字并不重要,重要的是形参的类型,所以在函数声明时,可以不写形参名。 当所调用的函数在主调函数之前定义时,可以省略函数声明。 当把GetMin函数定义在main函数之前,可以省略函数声明。,对于库函数的调用,需要用#include将相应的头文件包含进来。 函数调用离不开栈。栈是一种数据结构,具有先进后出的特点,也就是说最先进入栈的数据总是最后从栈里出来。 函数调用按照以下步骤进行: (1)在栈里保存函数调用现场和函数返回地址,以便当函数调用完毕后,能返回主调函数,

5、并且能让程序继续往下执行。 (2)在栈里给形参分配空间。 (3)计算实参表达式的值,然后将这个值拷贝给形参。 (4)执行函数体。 (5)函数体执行完毕后,通过弹栈操作释放形参所占的空间,并且得到返回地址和调用函数的现场状态,返回主调函数。,7.2.1 函数调用方式 函数调用的一般形式如下: 函数名 (实参表) 若被调用的函数没有参数,则实参表为空。 通常可以采用下面的方式来调用函数: (1)调用函数完成一定的功能,而不需要函数返回结果。若函数调用带有返回值,则这个值将会自动丢弃。 (2)另一种方式是调用函数,执行一定的操作,得到函数的返回值,并且把这个返回值代入表达式中参与计算。,7.2.2

6、参数传递 函数进行参数传递,是在栈空间里为形参分配空间,并将计算各个实参的表达式的值,然后一一拷贝给形参的过程。 1. 函数的值传递调用 缺省情况下,函数的参数传递过程是将实参表达式的值拷贝一份给形参。这样,实参变量和形参变量占据的是不同的存储空间。因此在函数里对形参变量的改变不会影响到实参变量的值。当函数返回时,由于对栈的操作,形参所占据的存储空间就被系统收回了,也就是说形参变量的值消失了。 这样做的好处是:通过这样的方式将形参和实参隔离,使函数与函数之间的关联减到最低,有利于实现模块化的设计,同时也不需要为要不要在调用函数之前保存实参的值而操心。,2. 函数的指针传递调用 在下面的这些情况

7、下,使用函数的值传递调用方式不太恰当或者不能达到目的: (1)要传递的参数是一个比较大的自定义的复杂数据类型,如果按值传递方式,需要将这个复杂的数据类型在被调用的函数的栈空间复制一份,这样对时间和空间的开销都比较大。 (2)有时需要在被调用函数里改变实参变量的值。 3. 函数的引用传递调用 函数也可以通过引用来传递参数。使用引用传递参数与传递指针的效果一样。如果将形参定义为引用,那么当进行参数传递时,实际上是将形参与实参绑定起来,让形参成为实参的别名,而并不是将实参拷贝了一份给形参。因为形参是实参的别名,所以对形参的操作等同于对实参变量的操作。,7.3 变量及作用域,在第6章讲动态内存分配的时

8、候,已经提到了C+将内存分为4个部分: (1)全局数据区(data area):存放全局变量、静态数据和常量。 (2)代码区(code area):函数。 (3)栈区(stack area):函数运行时分配的局部变量、函数参数、返回数据、返回地址等。 (4)堆区(heap area):内存中剩余的空间由程序员负责申请和释放。 因此,根据变量存储的内存区域不同,变量可以分为局部变量、全局变量和静态变量。 7.3.1 局部变量 在函数内部定义的变量称为局部变量,其有效范围仅仅是在该函数内。,7.3.2 全局变量 在所有函数外部定义的变量称作全局变量。在C+里,全局变量存储在全局数据区。全局变量在程

9、序一开始运行时就存在,在程序结束时才从内存里清除。正因为全局变量存储在全局数据区,所以全局变量对在它定义之后的所有函数都是可见的。在定义全局变量时,如果没有为其赋初值,编译器会把全局变量初始化为0。,7.3.3 静态局部变量 在定义的局部变量之前加上关键字“static”,则该变量则成为了静态局部变量。在C+里,静态局部变量存储在全局数据区里。因为静态局部变量存储在全局数据区里,所以在函数调用结束后,它所持有的值不会被丢弃掉,每次函数调用时也不会为它重新分配空间。静态局部变量如果在定义时没有赋初值,则C+会将其初始化为0。因此,静态局部变量具有全局变量的特性,另一方面,静态局部变量是定义在函数

10、里,其作用范围只能在其定义的函数体里。从某种意义上来说,静态局部变量是具有“记忆特性”的局部变量。,7.3.4 变量与作用域 作用域是变量的有效区域,不同的变量具有不同的作用域。 变量根据其定义的不同,具有语句块级、函数级、文件级、程序级作用域。 1. 语句块级 定义在一对花括号里的变量具有语句块级的作用域,其有效范围只局限这对大括号所在的范围里。 2. 函数级 在函数里定义的变量,其作用范围局限于变量所定义的函数体里。 3. 文件级 在一个文件里定义的静态全局变量,其作用范围局限于这个源文件。定义静态全局变量的方法是在定义的局部变量之前加“static”关键字。,4. 程序级 较大规模的C+

11、程序通常不会只由一个源文件组成。有时在一个源文件里需要用到另一个源文件里的全局变量,这个变量称作外部变量,它就具有程序级的作用域。 在同一个程序里,如果在一个源文件里要使用另一个源文件里的全局变量,需要在这个源文件里使用“extern”关键字对该全局变量进行声明。extern只是告诉编译器,它后面声明的变量在其他文件已有定义,它并不会在内存里重新定义一个变量。 7.3.5 变量的可见性 同一个程序里,如果在嵌套的作用域里定义了同名的变量,则在内层作用域中,外层定义的同名变量在内层是不可见的,也可说是内层变量隐藏了外层变量。,7.4 内部函数和外部函数,较大的程序一般都由多个源文件组成。根据函数

12、的使用范围不同,C+中将函数分成外部函数和内部函数两种。 外部函数是可以被其他文件所使用的函数,其定义的一般形式是: extern 返回类型 函数名 (形参列表) 函数体 外部函数是C+默认的函数类型,所以关键字“extern”可以省略。 内部函数只能在函数定义的文件里使用,其定义的一般形式是: static 返回类型 函数名 (形参列表) 函数体 内部函数的定义方法是在一般函数的定义方式前加上关键字“static”。当一个函数定义为内部函数后,其作用范围就是在定义该函数的文件内。,小结,函数是C+语言构造程序的重要的基本单位,是完成特定功能的基本模块。 函数使用通过函数调用来完成。一个C+程

13、序里包含一个主函数(即main函数)和若干个其他函数。由主函数调用其他函数,其他函数之间也可以互相调用。 被调用的函数必须是一个已经定义好的函数,函数定义的一般形式是: 返回类型 函数名(形参列表) 语句 return 合适的数值 ,在C+中,如果要调用一个函数,在调用它之前,必须对该函数进行声明。函数声明是一条语句,由函数返回类型、函数名和形参列表组成,其一般形式为: 返回类型 函数名(形参列表); 函数的调用离不开栈。在函数调用时,特别要注意对函数参数传递的理解。一般来说,在函数调用时进行参数传递可以分成下面的几种方式: (1)函数的值传递调用(传值调用)。 (2)函数的指针传递调用(传址

14、调用)。 (3)函数的引用传递调用。,根据变量存储的内存区域不同,变量可以分为局部变量、全局变量和静态变量。其中,局部变量在栈区分配空间,当函数执行完毕,其所在的内存空间就会被系统回收,所以局部变量是临时的。全局变量和静态变量在全局数据区分配空间,其在整个程序运行期都是存在的。 在理解变量的有效性时需要注意将变量的作用域和可见性结合起来判断。 较大的程序一般都由多个源文件组成。根据函数的使用范围不同,C+中将函数分成外部函数和内部函数两种。外部函数是可以被其他文件调用的函数,这也是C+中默认的函数形式。内部函数作用范围就是在定义该函数的文件内。使用内部函数,可以不用考虑其他文件里是否定义了同名的函数,有利于多人协同开发。 重点:函数的调用。 难点:变量类型的区分。,

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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