C语言程序设计2第9章函数与变量.ppt

上传人(卖家):三亚风情 文档编号:3377093 上传时间:2022-08-25 格式:PPT 页数:35 大小:304.37KB
下载 相关 举报
C语言程序设计2第9章函数与变量.ppt_第1页
第1页 / 共35页
C语言程序设计2第9章函数与变量.ppt_第2页
第2页 / 共35页
C语言程序设计2第9章函数与变量.ppt_第3页
第3页 / 共35页
C语言程序设计2第9章函数与变量.ppt_第4页
第4页 / 共35页
C语言程序设计2第9章函数与变量.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、退出退出 C源程序是由函数组成的。虽然在前面的示例程序中都只有一个源程序是由函数组成的。虽然在前面的示例程序中都只有一个主函数主函数main(),但在实际编程中往往有多个函数组成。函数是,但在实际编程中往往有多个函数组成。函数是C源程序最基本的模块,相当于其它高级语言的子程序。源程序最基本的模块,相当于其它高级语言的子程序。C语言提语言提供了极为丰富的库函数,库函数相当于标准程序。编写程序就是供了极为丰富的库函数,库函数相当于标准程序。编写程序就是编写函数以及使用库函数。各个函数之间为模块化关系。编写函数以及使用库函数。各个函数之间为模块化关系。可从不同的角度对函数分类。可从不同的角度对函数分

2、类。从定义的角度把函数分为库函数和用户定义函数。从定义的角度把函数分为库函数和用户定义函数。1 库函数库函数 库函数由系统提供,无须用户定义,也不必在程序中作类型库函数由系统提供,无须用户定义,也不必在程序中作类型说明,但必须在程序最前面使用包含有该函数原型的头文件。说明,但必须在程序最前面使用包含有该函数原型的头文件。库函数如:库函数如:printf、scanf、getchar、putchar、gets、puts。2 用户定义函数用户定义函数 由用户自己编写的函数。它不仅要在程序中定义,而且必须由用户自己编写的函数。它不仅要在程序中定义,而且必须在调用它的函数模块中进行类型说明。在调用它的函

3、数模块中进行类型说明。把函数分为有返回值函数和无返回值函数两种。把函数分为有返回值函数和无返回值函数两种。1 有返回值函数有返回值函数 函数被调用执行完后将向调用者返回一个执行结果,称为函数函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。如数学函数即属于此类函数。返回值。如数学函数即属于此类函数。用户定义的有返回值的函用户定义的有返回值的函数,必须在函数定义和函数说明中明确返回值的类型。数,必须在函数定义和函数说明中明确返回值的类型。2 无返回值函数无返回值函数 执行完成后不向调用者返回函数值。这类函数类似于其它语执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。由于

4、函数无返回值,在定义时可指定它为言的过程。由于函数无返回值,在定义时可指定它为“空类型空类型”,空类型的说明符为空类型的说明符为“void”。从主调函数和被调函数之间数据传送的角度可分为无参函数从主调函数和被调函数之间数据传送的角度可分为无参函数和有参函数两种。和有参函数两种。1 无参函数无参函数 调用函数与被调函数之间没有数据传送。则此类函数在定义、调用函数与被调函数之间没有数据传送。则此类函数在定义、说明及调用中均不带参数。说明及调用中均不带参数。2 有参函数有参函数 调用函数与被调函数之间有数据传送。则此类函数在定义、调用函数与被调函数之间有数据传送。则此类函数在定义、说明及调用中均带参

5、数。说明及调用中均带参数。函数是函数是C语言的核心,而所有的函数在定义时是平等关系语言的核心,而所有的函数在定义时是平等关系(包括主函数(包括主函数main在内在内),所谓平等是指:在一个函数的函数体,所谓平等是指:在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。这与其它语言的内,不能再定义另一个函数,即不能嵌套定义。这与其它语言的子程序关系十分不同。这叫做子程序关系十分不同。这叫做“函数定义的外部性函数定义的外部性”。函数之间允许调用,也允许嵌套调用。甚至可以自己调用自函数之间允许调用,也允许嵌套调用。甚至可以自己调用自己己(称为递归调用称为递归调用)。但是,对主函数。但是,对主

6、函数main函数而言,可以调用其函数而言,可以调用其它函数,而不能被其它函数调用。程序的执行总是从它函数,而不能被其它函数调用。程序的执行总是从main函数函数开始,完成对其它函数调用后再返回到开始,完成对其它函数调用后再返回到main函数,最后由函数,最后由main函函数结束整个程序。一个源程序必须有、也只能有一个主函数数结束整个程序。一个源程序必须有、也只能有一个主函数main。习惯上把调用者称为主调函数。被调用者称为被调函数。习惯上把调用者称为主调函数。被调用者称为被调函数。无参函数定义通常采用如下形式:无参函数定义通常采用如下形式:类型说明符和函数名称为函数头。类型说明符和函数名称为函

7、数头。类型说明符指明了本函数类型说明符指明了本函数的类型,就是函数返回值的类型。函数名是由用户定义的标识符。的类型,就是函数返回值的类型。函数名是由用户定义的标识符。中的内容称为函数体,这是函数的核心。中的内容称为函数体,这是函数的核心。函数体中的类型说明用来说明函数体内部所用变量的类型。函数体中的类型说明用来说明函数体内部所用变量的类型。若不要求无参函数有返回值,则函数类型符可以写为若不要求无参函数有返回值,则函数类型符可以写为void。【例【例9-1】(见课本)见课本)有参函数定义通常采用如下形式:有参函数定义通常采用如下形式:1 函数类型函数类型 就是函数返回值的类型。系统默认为就是函数

8、返回值的类型。系统默认为int,故对,故对int或或char型可型可以不定义类型。以不定义类型。对于不需要返回值的类型,则应定义为空函数,即函数类型对于不需要返回值的类型,则应定义为空函数,即函数类型为:为:void。2 函数名函数名 函数的标识,即给不同的函数起不同的名字。函数名应符合函数的标识,即给不同的函数起不同的名字。函数名应符合C语言对标识符的规定。语言对标识符的规定。3 形式参数列表形式参数列表 形式参数列表逐一列出形式参数的类型与名称,之间用逗号形式参数列表逐一列出形式参数的类型与名称,之间用逗号隔开。如:隔开。如:形式参数的类型决定函数可以接受的数据类型。形式参数的类型决定函数

9、可以接受的数据类型。形式参数实际上是一种替身,代替实际参数在函数中先占位形式参数实际上是一种替身,代替实际参数在函数中先占位置。它有点像代数式中的变量置。它有点像代数式中的变量xy。4 函数体函数体 是函数中最独特的部分,实际上它决定了函数的功能。是函数中最独特的部分,实际上它决定了函数的功能。函数体可以是空的,此函数就是空函数,什么也不做。函数体可以是空的,此函数就是空函数,什么也不做。5 类型说明类型说明 形式参数既然作为变量应有类型说明。形式参数既然作为变量应有类型说明。6 函数的返回函数的返回 返回就是函数执行结束,返回到调用它的函数。有返回值则返回就是函数执行结束,返回到调用它的函数

10、。有返回值则代回,也可以没有返回值。代回,也可以没有返回值。通常用通常用return语句来实现返回。语句来实现返回。return语句可以包含表达式。此时,则返回表达式的值。语句可以包含表达式。此时,则返回表达式的值。若若return语句不包含表达式,则返回一个不确定的值。为避语句不包含表达式,则返回一个不确定的值。为避免可能引起的问题,此时应指定函数的类型为免可能引起的问题,此时应指定函数的类型为void。函数可以有多个出口,即可以有多个函数可以有多个出口,即可以有多个return语句。但是,每语句。但是,每 个个return语句中的表达式的类型应相同。语句中的表达式的类型应相同。7 函数定义

11、的位置无关性函数定义的位置无关性 函数的定义可以放在任意位置,既可放在主函数函数的定义可以放在任意位置,既可放在主函数main之前,之前,也可放在也可放在main之后。之后。总之,函数主要由三要素组成:输入、过程及输出。总之,函数主要由三要素组成:输入、过程及输出。【例【例9-2】(见课本)见课本)【例【例9-3】(见课本)见课本)对本函数要定义的函数作一个声明,以便编译系统对函数进行对本函数要定义的函数作一个声明,以便编译系统对函数进行检查。主要声明函数的输入信息:函数名,函数类型,形式参数检查。主要声明函数的输入信息:函数名,函数类型,形式参数的类型、个数及次序。的类型、个数及次序。格式如

12、下:格式如下:注意格式末尾的分号不可缺少。注意格式末尾的分号不可缺少。在实际使用中,最好在文件程序对本程序所使用的函数逐一、在实际使用中,最好在文件程序对本程序所使用的函数逐一、全部、集中声明。全部、集中声明。在以下几种情况下,可以不做声明:在以下几种情况下,可以不做声明:l函数的返回值是整形或字符型时;函数的返回值是整形或字符型时;l被调用函数的定义位置在主函数位置之前时;被调用函数的定义位置在主函数位置之前时;l在所有函数定义之前、在文件的开头已经说明了时;在所有函数定义之前、在文件的开头已经说明了时;【例【例9-4】(见课本)见课本)调用函数就是使用已经定义了的函数,通常通过对函数的调用

13、调用函数就是使用已经定义了的函数,通常通过对函数的调用来执行函数体,其过程与其它语言的子程序调用相似。函数调用来执行函数体,其过程与其它语言的子程序调用相似。函数调用 的一般形式为:的一般形式为:实际参数表中的参数可以是常数,变量或其它构造类型数据实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。及表达式。各实际参数之间用逗号分隔。各实际参数之间用逗号分隔。对无参函数调用时则无实际参数表。其格式为:对无参函数调用时则无实际参数表。其格式为:在在C语言中,可以用多种方式调用函数。以下简述之。语言中,可以用多种方式调用函数。以下简述之。1 函数表达式函数表达式 函数作为表达式中的一项出

14、现在表达式中,以函数返回值参函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:与表达式的运算。这种方式要求函数是有返回值的。例如:这是一个赋值表达式,把这是一个赋值表达式,把max的返回值赋予变量的返回值赋予变量z。2 2 函数语句函数语句 把函数作为一个语句,即一般形式加上分号。例如:把函数作为一个语句,即一般形式加上分号。例如:都是以函数语句的方式调用函数。都是以函数语句的方式调用函数。3 3 函数实际参数函数实际参数 函数作为另一个函数调用的实际参数出现。函数作为另一个函数调用的实际参数出现。这种情况是把该这种情况是把该函数的返回值作

15、为实际参数进行传送,因此要求该函数必须是有函数的返回值作为实际参数进行传送,因此要求该函数必须是有返回值的。例如:返回值的。例如:即是把即是把max调用的返回值又作为调用的返回值又作为printf函数的实际参数来使用函数的实际参数来使用的。的。【例【例9-5】(见课本)见课本)函数调用的方式主要有以下几种。这些调用方式极大地增强函数调用的方式主要有以下几种。这些调用方式极大地增强了函数的作用。其功能强大,但使用中也应细心,否则造成的问了函数的作用。其功能强大,但使用中也应细心,否则造成的问题也严重。题也严重。1 传值调用传值调用 调用时,把实际参数的值传递给形式参数,再执行函数。可调用时,把实

16、际参数的值传递给形式参数,再执行函数。可以有返回值,也可以没有返回值而只是执行某种操作。以有返回值,也可以没有返回值而只是执行某种操作。实际参数是调用函数中的变量,形式参数是被调用函数中的变实际参数是调用函数中的变量,形式参数是被调用函数中的变量。在存储方面有以下特点:量。在存储方面有以下特点:l形式参数与实际参数各占独立的存储空间;形式参数与实际参数各占独立的存储空间;l形式参数的存储空间是调用时才分配的;形式参数的存储空间是调用时才分配的;l调用结束时,撤消分配给形式参数的临时存储区;调用结束时,撤消分配给形式参数的临时存储区;l实际参数可以是常量、变量、表达式、函数等,无论实际参数是实际

17、参数可以是常量、变量、表达式、函数等,无论实际参数是何种类型的量,在进行函数调用时,它们都必须具有确定的值,何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形式参数;以便把这些值传送给形式参数;l实际参数和形式参数的数量、类型、顺序应严格一致;实际参数和形式参数的数量、类型、顺序应严格一致;l函数调用中发生的数据传送是单向的。即只能把实际参数的值传函数调用中发生的数据传送是单向的。即只能把实际参数的值传送给形式参数,而不能把形式参数的值反向地传送给实际参数。送给形式参数,而不能把形式参数的值反向地传送给实际参数。因此在函数调用过程中,形式参数的值发生改变,而实际参数中

18、因此在函数调用过程中,形式参数的值发生改变,而实际参数中的值不会变化;的值不会变化;【例【例9-6】(见课本)见课本)2 嵌套调用嵌套调用 嵌套调用就是在被调用的函数中再调用其它函数。嵌套调用就是在被调用的函数中再调用其它函数。【例【例9-7】(见课本)见课本)3 递归调用递归调用 直接或间接地调用函数本身。此时应特别注意递归的结束条直接或间接地调用函数本身。此时应特别注意递归的结束条件,仔细推敲它是否真正有效,必要时可人为设置递归终止条件件,仔细推敲它是否真正有效,必要时可人为设置递归终止条件(如控制调用次数如控制调用次数)。【例【例9-8】(见课本)见课本)变量有效的范围称为变量的作用域。

19、语言中的变量,按作变量有效的范围称为变量的作用域。语言中的变量,按作用域范围可分为两种,用域范围可分为两种,即局部变量和全局变量。即局部变量和全局变量。局部变量也称为内部变量。局部变量是在函数内作定义说明局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。法的。【例【例9-9】(见课本)见课本)1 主函数的变量只能用于主函数中主函数的变量只能用于主函数中 主函数中定义的变量也只能在主函数中使用,不能在其它函数主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主

20、函数中也不能使用其它函数中定义的变量。因中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。其它语言不同的,应予以注意。2形式参数与实际参数范围不同形式参数与实际参数范围不同 形式参数变量是属于被调函数的局部变量,实际参数变量是形式参数变量是属于被调函数的局部变量,实际参数变量是属于主调函数的局部变量。属于主调函数的局部变量。3 局部变量可以同名局部变量可以同名 允许在不同的函数中使用相同的变量名,它们代表不同的对允许在不同的函数中使用相同的变量名,它

21、们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。象,分配不同的单元,互不干扰,也不会发生混淆。就是形式参数和实际参数的变量同名也是允许的。就是形式参数和实际参数的变量同名也是允许的。【例【例9-10】(见课本)见课本)全局变量也称为外部变量。在一个文件中,定义在函数之外全局变量也称为外部变量。在一个文件中,定义在函数之外的变量称为全局变量。它不属于哪一个函数,它属于一个源程序的变量称为全局变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是:从定义它的那一点直到文件末尾。整个源程文件。其作用域是:从定义它的那一点直到文件末尾。整个源程序。在函数中使用全局变量,一般应作全局变量

22、说明。只有在函序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为数内经过说明的全局变量才能使用。全局变量的说明符为extern。但但 在一个函数之前定义的全局变量,在该函数内使用可不再在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。加以说明。外部变量定义必须在所有的函数之外,且只能定义一次。其一外部变量定义必须在所有的函数之外,且只能定义一次。其一般形式为:般形式为:外部变量说明出现在要使用该外部变量的各个函数内。在整个外部变量说明出现在要使用该外部变量的各个函数内。在整个程序内,可能出现多次,外部变量说明的一般形式为:程序内

23、,可能出现多次,外部变量说明的一般形式为:全局变量在编译时分配存储空间。全局变量在编译时分配存储空间。1 外部变量的值具有继承性外部变量的值具有继承性 如果在一个函数中改变了外部变量的值,则其后引用该变量如果在一个函数中改变了外部变量的值,则其后引用该变量时,得到的是改变了的值。因此,可以使用外部变量在不同的函时,得到的是改变了的值。因此,可以使用外部变量在不同的函数间传递数据。数间传递数据。2 静态外部变量静态外部变量 它允许本文件使用的外部变量。它可以使不同文件之间同名它允许本文件使用的外部变量。它可以使不同文件之间同名的外部变量互不干扰。其说明格式为:的外部变量互不干扰。其说明格式为:初

24、值默认为初值默认为0。3 外部变量在文件内作用范围的扩展外部变量在文件内作用范围的扩展 可以使用可以使用extern命令,把作用范围扩展到从命令,把作用范围扩展到从extern命令开始。命令开始。4 外部变量在文件外的扩张外部变量在文件外的扩张 可以把外部变量的作用范围扩展到后来运行的、有可以把外部变量的作用范围扩展到后来运行的、有extern命令命令的文件中。的文件中。5 外部变量的副作用外部变量的副作用 外部变量建立了函数之间的另外一条数据交换渠道(正常的外部变量建立了函数之间的另外一条数据交换渠道(正常的渠道是传递参数及得到返回值)。这样,很可能形成某个外部变渠道是传递参数及得到返回值)

25、。这样,很可能形成某个外部变量与多个函数量与多个函数(甚至文件甚至文件)的关联。若其中一个模块异常,都可能的关联。若其中一个模块异常,都可能引起此外部变量的异常。而此外部变量的异常,又会引起其它模引起此外部变量的异常。而此外部变量的异常,又会引起其它模块的异常,造成块的异常,造成“牵一发而动全身牵一发而动全身”,是问题扩大化与复杂化。,是问题扩大化与复杂化。这会给程序的调试与运行带来不便。为避免此问题,建议尽量使这会给程序的调试与运行带来不便。为避免此问题,建议尽量使用静态外部变量,把它控制在你所编写的程序内。用静态外部变量,把它控制在你所编写的程序内。【例【例9-11】(见课本)见课本)【例

26、【例9-12】(见课本)见课本)【例【例9-13】(见课本)见课本)变量是程序中数据的传递者,变量具有两种属性:操作属性变量是程序中数据的传递者,变量具有两种属性:操作属性和存储属性。操作属性就是指数据类型,存储属性就是指数据的和存储属性。操作属性就是指数据类型,存储属性就是指数据的存储位置与时间。存储位置与时间。1 变量可用的存储空间变量可用的存储空间 可以用来存放变量的存储空间是内存和寄存器。内存大家已可以用来存放变量的存储空间是内存和寄存器。内存大家已经了解。寄存器是经了解。寄存器是CPU中的一个数据临时存储区,其容量有限中的一个数据临时存储区,其容量有限(一般都比内存小的多),但系统对

27、寄存器中数据的读写操作的(一般都比内存小的多),但系统对寄存器中数据的读写操作的速度则较快。速度则较快。2 变量生存周期变量生存周期 就是变量存在的时期。根据其存在时期的长短,可以把变量分就是变量存在的时期。根据其存在时期的长短,可以把变量分为以下两种:为以下两种:(1)(1)静态变量静态变量 在程序执行的整个过程中都存在,并有固定的存储空间。在程序执行的整个过程中都存在,并有固定的存储空间。(2)(2)动态变量动态变量 只在程序执行的一段时间内存在,没有固定的存储空间。只在程序执行的一段时间内存在,没有固定的存储空间。变量按存储方式可分为变量按存储方式可分为“静态存储静态存储”和和“动态存储

28、动态存储”两种。两种。静态存储变量通常是在变量定义时就分定存储单元并一直保持不静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。动态存储变量是在程序执行过程中,使变,直至整个程序结束。动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形式参数分配存储单元,只是的形式参数,在函数定义时并不给形式参数分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用,

29、则反复地分配、释放形式参数变量的存储单个函数被多次调用,则反复地分配、释放形式参数变量的存储单元。元。静态存储变量是一直存在的,而动态存储变量则时而存在静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。这种由于变量存储方式不同而产生的特性就是变量的时而消失。这种由于变量存储方式不同而产生的特性就是变量的生存周生存周 期。生存周期表示了变量存在的时间。生存期和作用域是期。生存周期表示了变量存在的时间。生存期和作用域是从时间从时间 和空间这两个不同的角度来描述变量的特性,这两者既有和空间这两个不同的角度来描述变量的特性,这两者既有联系,联系,又有区别。又有区别。3 3 变量的可用性变量的

30、可用性 (1)(1)全局可用全局可用 (2)(2)局部可用局部可用 动态变量可用分为自动变量和寄存器变量两大类。动态变量可用分为自动变量和寄存器变量两大类。1 自动变量自动变量 由系统自动建立和撤消的变量。自动变量用时建、用完撤。由系统自动建立和撤消的变量。自动变量用时建、用完撤。从使用时间来看,具有招之即来、挥之即去的特点。从使用时间来看,具有招之即来、挥之即去的特点。自动变量在每次使用时才分配存储单元,用完清除存储单元。自动变量在每次使用时才分配存储单元,用完清除存储单元。下次用时再分配新的存储单元(可能不是上次所用的存储单元)。下次用时再分配新的存储单元(可能不是上次所用的存储单元)。从

31、存储空间来看,具有从存储空间来看,具有“打一枪换一个地方打一枪换一个地方”的特点。的特点。(1)(1)定义格式定义格式 自动变量的定义格式如下:自动变量的定义格式如下:以上格式中以上格式中内的内容可以省略。以下对格式中的各项加以内的内容可以省略。以下对格式中的各项加以解释:解释:数据类型数据类型 表明变量的数据类型。表明变量的数据类型。量名量名 变量名字,可以与其它程序中变量的名字相同。变量名字,可以与其它程序中变量的名字相同。初始表达式初始表达式 用来给变量赋初值。若不给变量赋初值,则变量的初始不确用来给变量赋初值。若不给变量赋初值,则变量的初始不确定定(初始值取决于分配给此变量的存储单元中

32、存储的当前值初始值取决于分配给此变量的存储单元中存储的当前值)。也。也可以在程序段中用赋值语句来赋给初始值。但是,只能赋给一次可以在程序段中用赋值语句来赋给初始值。但是,只能赋给一次初始值,不可重复。初始值,不可重复。(2)(2)自动变量的局部性自动变量的局部性 自动变量是局部变量,仅仅在定义它的那个局部有效。自动变量是局部变量,仅仅在定义它的那个局部有效。(3)(3)值不继承值不继承 自动变量的值没有继承性,也就是说,函数调用自动变量时,自动变量的值没有继承性,也就是说,函数调用自动变量时,自动变量现有的值不保留,而是以现赋的初始值替代原值。自动变量现有的值不保留,而是以现赋的初始值替代原值

33、。【例【例9-14】(见课本)见课本)【例【例9-15】(见课本)见课本)【例【例9-16】(见课本)见课本)2 寄存器变量寄存器变量 寄存器变量存放在寄存器变量存放在CPU的寄存器中。使用时,不需要访问内的寄存器中。使用时,不需要访问内存,而直接从寄存器中读写,有较高的读写效率。通常用于循环存,而直接从寄存器中读写,有较高的读写效率。通常用于循环次数较多的循环控制变量及循环体内反复使用的变量。次数较多的循环控制变量及循环体内反复使用的变量。要定义寄存器变量,可采用如下格式:要定义寄存器变量,可采用如下格式:寄存器变量的性质与自动变量的性质完全相同,只是放的位寄存器变量的性质与自动变量的性质完

34、全相同,只是放的位置不同。置不同。若硬件中闲置的寄存器中不足容纳所定义的寄存器变量,则若硬件中闲置的寄存器中不足容纳所定义的寄存器变量,则系统自动把寄存器变量转换为自动变量。系统自动把寄存器变量转换为自动变量。应该把变量按照操作情况排序,尽量把使用频繁的变量设置为寄应该把变量按照操作情况排序,尽量把使用频繁的变量设置为寄存器变量。存器变量。在实际应用中,因为机器硬件所限,寄存器变量使用不是很在实际应用中,因为机器硬件所限,寄存器变量使用不是很多。多。【例【例9-17】(见课本)见课本)1 静态变量的定义格式静态变量的定义格式 要定义静态变量,可采用如下格式:要定义静态变量,可采用如下格式:静态

35、变量具有如下特点:静态变量具有如下特点:l静态变量在程序运行期间固定不变。它在编译时就分配存储空间,静态变量在程序运行期间固定不变。它在编译时就分配存储空间,程序一开始执行就建立,直到程序结束一直存在;程序一开始执行就建立,直到程序结束一直存在;l静态变量的初始化在编译时进行,默认的初始值为静态变量的初始化在编译时进行,默认的初始值为0或或0.0;l只能使用常数或常数表达式赋给初值,不能用含变量的表达式赋只能使用常数或常数表达式赋给初值,不能用含变量的表达式赋初值;初值;静态变量可以从其作用域分为静态局部变量和静态全局变量。静态变量可以从其作用域分为静态局部变量和静态全局变量。2 静态局部变量

36、静态局部变量 在局部变量的说明前再加上在局部变量的说明前再加上static说明符就构成静态局部变量。说明符就构成静态局部变量。例如:例如:静态局部变量属于静态存储方式,它具有以下特点。静态局部变量属于静态存储方式,它具有以下特点。(1)(1)生命期为程序运行期生命期为程序运行期 静态局部变量虽然在函数内定义,但不象自动变量那样,当静态局部变量虽然在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序运行期。也就是说它的生存期为整个源程序运行期。(2)(2)作用的范围只是定

37、义它的函数内作用的范围只是定义它的函数内 静态局部变量的生存期虽然为整个源程序,但是其作用域仍静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,出该函数后,尽管该变量还继续存在,但不能使用它。尽管该变量还继续存在,但不能使用它。也就是说,静态局部变量只能在本函数中使用,具有也就是说,静态局部变量只能在本函数中使用,具有“从一从一而终而终”的特点。的特点。(3)(3)值可继承值可继承 静态局部变量的值具有可继承性。下次调用时,上次的结果静态局部变量的值具有可继承性。下次调

38、用时,上次的结果值还在。也就是说,只在第一次调用时初始化。当多次调用一个值还在。也就是说,只在第一次调用时初始化。当多次调用一个函数且要求在各次调用之间保留某些变量的值时,可考虑采用静函数且要求在各次调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。有时会造成意外的副作用,因此仍以采用局部静态变量为宜。【例【例9-18】(见课本)见课本)3静态全局变量静态全局变量 全局变量全局变量(外部变量外部变量)的说明之前加上的说明之前加上static

39、就构成了静态的全就构成了静态的全局变量。全局变量与静态全局变量的区别在于:非静态全局变量局变量。全局变量与静态全局变量的区别在于:非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则静态的全局变量在各个源文件中都是有效的。而静态全局变量则只在定义该变量的源文件内有效,在同一源程序的其它源文件中只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它,可以避免在其它源文件中引起错误。不能使用它,可以避免在其它源文件中引起错误。函数一旦定义后就可被本文件的其它

40、函数调用,但函数能否函数一旦定义后就可被本文件的其它函数调用,但函数能否被其它源文件中的函数调用则取决于函数的性质。从这一角度,被其它源文件中的函数调用则取决于函数的性质。从这一角度,把函数分为内部函数与外部函数。把函数分为内部函数与外部函数。在一个源文件中定义的函数只能被本文件中的函数调用,而在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,这种函数称为内部函不能被同一源程序其它文件中的函数调用,这种函数称为内部函数。定义内部函数的一般形式是:数。定义内部函数的一般形式是:例如:例如:内部函数也称为静态函数。但此处静态内部函数也称为静态函数。但此处静态

41、static的含义已不是指的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。因此在不存储方式,而是指对函数的调用范围只局限于本文件。因此在不同的源文件中定义同名的静态函数不会引起混淆。同的源文件中定义同名的静态函数不会引起混淆。外部函数在整个源程序中都有效,其定义的一般形式为:外部函数在整个源程序中都有效,其定义的一般形式为:例如:例如:如在函数定义中没有说明如在函数定义中没有说明extern或或static则默认为则默认为extern。在一个源文件的函数中调用其它源文件中定义的外部函数时,在一个源文件的函数中调用其它源文件中定义的外部函数时,应用应用extern说明被调函数为外部函数。说明被调函数为外部函数。【例【例9-19】(见课本)见课本)

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

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


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

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


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