内部变量外部变量

上传人:宝路 文档编号:47913376 上传时间:2018-07-06 格式:PPT 页数:33 大小:63.82KB
返回 下载 相关 举报
内部变量外部变量_第1页
第1页 / 共33页
内部变量外部变量_第2页
第2页 / 共33页
内部变量外部变量_第3页
第3页 / 共33页
内部变量外部变量_第4页
第4页 / 共33页
内部变量外部变量_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《内部变量外部变量》由会员分享,可在线阅读,更多相关《内部变量外部变量(33页珍藏版)》请在金锄头文库上搜索。

1、6.2 6.2 内部变量与外部变量内部变量与外部变量C语言中,将变量的有效范围称为变量的 作用域。所有的变量都有自己的作用域,变 量定义的位置不同,其作用域也不同,作用 域是从空间角度对变量特性的一个描述。按 照变量的作用域,将语言中的变量分为内 部变量和外部变量。 6.2.1 内部变量1内部变量的概念和定义在一个函数(包括main()函数)内部或 复合句内部定义的变量称为内部变量,自 然,函数的形参属于内部变量。内部变量 只在该函数范围内或该复合句范围内有效 。也就是说,内部变量的作用域局限于定 义它的函数或复合句内部,在此函数之外 或此复合句之外就不能使用这些变量了。 所以,内部变量也称局

2、部变量。前面我们使用的所有变量都属于内部变量 ,例如,95页【例6.10】中,void()函数中定 义的变量i,其作用域局限于void()函数内,在 main() 函数中无效;main()函数中定义的变量 i也只在main()函数内有效.再如:96页,fun1()函数中定义的变量 p1,p2,p3,其作用域局限于fun1()函数内,在 main() 函数中无效; fun2()函数中定义的变量 p4,p5,p6,其作用域局限于fun2()函数内,在 main() 函数中无效; main()函数中定义的变量 x,y,a,b也只在main()函数内有效.说明:在复合句中也可定义变量,其作用域只 在复

3、合句范围内。例如: 【例6.5】 输入任意三个整数,按从小到大的顺序输 出。 main() int num1,num2,num3;printf(“Please input three numbers:“);scanf(“%d,%d,%d“, int max(int a,int b) int c;c=ab?a:b;return c; main() int a=8;printf(“max=%dn“,max(a,b); 程序运行结果如下:max=8本例中,main()函数中定义的内部变量a与外 部变量同名,max()函数中定义的形参a、b也与外 部变量同名。因此,在main()函数中,外部变量a 被

4、屏蔽,调用max()函数的实参a是内部变量,值 为8,实参b是外部变量,值为5。在max()函数中 ,外部变量a、b均被屏蔽,形参a、b的值为实参 所传递,分别为8和5,所以输出结果为8。从本例可以看出,外部变量与内部变量同名时容 易混淆其作用域,因此在程序设计中应尽量避免其同 名。(2)外部变量的作用域是从定义点开始到本源文件 结束为止的。如果定义点之前的函数需要引用这些外 部变量,则需要在函数内对被引用的外部变量进行声 明。外部变量声明的一般形式为extern 类型名 外部变量 ,外部变量2;可通过对外部变量的声明将其作用域延伸到定 义它的位置之前的函数中。外部变量的定义和外部变量的声明是

5、两 回事。外部变量的定义,必须在所有的函数 之外,且只能定义一次。而外部变量的声明 ,出现在要使用该外部变量的函数内,而且 可以出现多次。外部变量在定义时分配内存 单元,并可以初始化;外部变量声明时,不 能再赋初值,只是表明在该函数内要使用这 些外部变量。如97页例题中b,c是外部变量的 定义,d,e是外部变量的说明。6.2.4 内部函数和外部函数函数在本质上是全局的,因为一个函数需要被其他函数调用。那么,当一个源程序由多个源文件组成时,在一个源文件中定义的函数,能否被其他源文件中的函数调用呢?语言根据函数能否被其他源文件中的函数调用,将函数分为内部函数和外部函数。6.2.4 内部函数1内部函

6、数的概念和定义如果在一个源文件中定义的函数,只能 被本源文件中的函数调用,而不能被同一程 序中其他源文件中的函数调用,则这种函数 称为内部函数。内部函数的作用域局限于定 义它的源文件内部。定义一个内部函数,只需在函数定义的 首部函数类型前再加一个“static“关键字即可 ,如下所示:static 类型名 函数名(参数定义表 ) 函数体 关键字static译成中文就是“静态的”,所以 ,内部函数又称静态函数。但此处,static的含义不 是指存储方式,而是指函数的作用域仅局限于本源 文件内。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其他源文件中的函数同名。

7、外部函数1外部函数的概念如果在一个源文件中定义的函数,除可被本源文件中的其 他函数调用外,也可被其他源文件中的函数所调用,则这种 函数称为外部函数。外部函数的作用域是整个源程序。2外部函数的定义在定义函数时,如果没有加关键字static,或冠以关键字 extern,表示此函数是外部函数,如下所示:extern 类型名 函数名( 参数定义表 ) 函数体 与调用本源文件中的函数一样,需要对被调用的外部函数进行如下声明:extern 类型名 函数名( 参数类型表 ),函数名2( 参数类型表2 );6.3 6.3 变量的动态存储与静态存储变量的动态存储与静态存储 6.3.1 动态存储与静态存储的概念在

8、C语言中,每个变量都有两个属性 :数据类型和存储类型。存储类型是指变量 在内存中存储的方式。各种变量的作用域不 同,就其本质来说是因为变量的存储类型不 同。变量的存储类型分为静态存储和动态存 储两大类。静态存储变量通常是在变量定义时就分 配存储单元,并一直保持不释放,直至整个 程序运行结束才释放。前面介绍的外部变量 即属于此类存储方式。动态存储变量是在程序执行过程中,使 用它时才分配存储单元,使用完毕立即释放 。典型的例子是函数的形式参数,在函数定 义时并不给形参分配存储单元,只是在函数 被调用时,才予以分配,调用完毕立即释放 。如果一个函数被多次调用,则反复地分配 、释放形参变量的存储单元。

9、由此可知,静态存储变量是一直存在的, 而动态存储变量则时而存在、时而消失。这种 由于变量存储方式的不同而产生的特性,称为 变量的生存期。生存期表示了变量存在的时间 。生存期和作用域分别从时间和空间这两个不 同的角度描述了变量的特性。这两者既有联系 ,又有区别。一个变量究竟属于哪一种存储方式,并不 能仅从其作用域来判断,还应有明确的存储类 型定义。因此,变量定义的完整形式应为存储类型 数据类型 变量名,变量名2;在C语言中,对变量的存储类型定义有以 下四种:自动变量(auto)、寄存器变量(register) 、外部变量(extern)和静态内部变量(static)。自 动变量和寄存器变量属于动

10、态存储方式,外部 变量和静态内部变量属于静态存储方式。对一 个变量的定义,不仅应定义其数据类型,还应 定义其存储类型。static 数据类型 内部变量表;存储特点:(1) 静态内部变量属于静态存储,是在 编译时为其分配存储单元的,其生存期为 整个程序执行期间。在程序执行过程中, 即使所在函数被调用结束也不释放,一直 存在。但其他函数不能引用它们。(2) 静态内部变量是在编译时赋初值的 ,若定义而不初始化,则自动赋以0(整型 和实型)或0(字符型),也即系统会自动初 始化为0值。每次调用静态内部变量所在的 函数时,不再重新赋初值,只是保留上次 调用结束时的值,如99页例题所示。寄存器存储寄存器变

11、量一般情况下,变量的值都是存储在内存 中的。为提高执行效率,语言允许将内部变 量的值存放到寄存器中,这种变量称为寄存器 变量。定义格式如下:register 数据类型 变量表;说明: 只有内部变量和形参变量才能定义为寄存 器变量,外部变量则不行。【例6.7】 输出14的阶乘。 long factorial(int n) register long i,fact=1; /*定义寄存器变量*/for (i=1;i以前已多次用此命令包含过Turbo C库函数的头文件。例如:#include“stdio.h“ 及 #include“math.h“文件包含命令的功能是把指定的文件插入该命令行位置取代该命

12、令行, 从而把指定的文件和当前的源程序文件连成一个源文件。在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块,由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其他文件的开头用包含命令包含该文件即可使用。利用此方式,可避免在每个文件开头都去定义那些公用量,从而节省时间,并减少出错。说明:(1) 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。如“#include”stdio.h“”或“#include”。但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号则表示首先

13、在当前的源文件目录中查找,若未找到才到包含目录中去查找。 用户编程时可根据自己文件所在的目录来选择某一种命令形式。(2) 一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。(3) 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。6.3.2 宏替换在C语言源程序中,允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。 宏代换是由预处理程序自动完成的。宏提供了一种词法符号

14、替换机制,它们可带也可不带类似函数参数的形式参数。#define 指令定义宏。不带参数宏定义无参宏的宏名后不带参数。其定义的一般形式为#define 标识符 字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。define为宏定义命令。标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。如:#define PI 3.14159 /*定义值*/#define R 4【例6.6】 利用无参宏定义形式定义各种类型符号常量并输出。本例通过定义各种数值及字符串,完成一个给定半径情况下,圆面积的计算输出。/*程序功能:计算给定半径下圆的面积,并按照给定提示输出*/#inclu

15、de “stdio.h“#define PI 3.14159 /*定义值*/#define R 4 /*定义半径值*/#define INFO “The area is:“ /*定义面积输出提示*/main( ) printf(“%s %fn“,INFO,PI*R*R); /*以给定提示字符串输出面积值*/程序运行情况:The area is 50.265440说明:1) 根据一般C语言程序中变量的命名规则,符号常量的定义一般习惯使用大写字母表示,这主要是因为通常在一般变量的定义中,常使用小写字母的原因。当然,符号常量也可以小写字母命名2)宏定义是用宏名来表示一个字符串,在宏展开时又 以该字符

16、串取代宏名,属于一种简单的代换。3)宏定义常用于程序中反复使用的表达式4) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要 终止其作用域,可使用# undef命令。例如:# define PI 3.14159main() # undef /*终止PI的作用域*/f1()利用# undef 后,使得PI只在main函数中有效,在f1()函数中无效。带参数宏定义C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为#define 宏名(形参表) 字符串 其中,在字符串中含有各个形参

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

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