内部变量外部变量.ppt

上传人:牧羊曲112 文档编号:5240031 上传时间:2023-06-17 格式:PPT 页数:33 大小:339.47KB
返回 下载 相关 举报
内部变量外部变量.ppt_第1页
第1页 / 共33页
内部变量外部变量.ppt_第2页
第2页 / 共33页
内部变量外部变量.ppt_第3页
第3页 / 共33页
内部变量外部变量.ppt_第4页
第4页 / 共33页
内部变量外部变量.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《内部变量外部变量.ppt》由会员分享,可在线阅读,更多相关《内部变量外部变量.ppt(33页珍藏版)》请在三一办公上搜索。

1、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()函数内有效.,说明:在复合句中也可定义变量,其作用域只在复合句范围内。例如:【例6.5】输入任意三个整数,按从小到大的顺序输出。

3、main()int num1,num2,num3;printf(Please input three numbers:);scanf(%d,%d,%d,&num1,&num2,&num3);,if(num1num2)int temp;temp=num1;num1=num2;num2=temp;if(num2num3)int temp;temp=num2;num2=num3;num3=temp;if(num1num2)int temp;temp=num1;num1=num2;num2=temp;printf(Three numbers after sorted:%d,%d,%dn,num1,nu

4、m2,num3);程序运行情况如下:Please input three numbers:8,0,5Three numbers after sorted:0,5,8本例中的temp变量的作用域局限于复合句内。,6.2.2 外部变量 1外部变量的概念和定义 在函数外部定义的变量称为外部变量。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本源文件结束为止。外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量。例如97页例题中a,b存储类别就是外部型,说明:(1)在同一源文件中,允许外部变量和内部变量同名。同名时在内部变量的作用域内,外部变量将被屏蔽而不起作用,如下

5、例所示。【例6.6】外部变量与内部变量同名举例。int a=3,b=5;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被屏蔽,调用max()函数的实参a是内部变量,值为8,实参b是外部变量,值为5。在max()函数中,外部变量a、b均被屏蔽,形参a、b的值为实参所传递,分别为8和5,所以输出结果为8。,

6、从本例可以看出,外部变量与内部变量同名时容易混淆其作用域,因此在程序设计中应尽量避免其同名。(2)外部变量的作用域是从定义点开始到本源文件结束为止的。如果定义点之前的函数需要引用这些外部变量,则需要在函数内对被引用的外部变量进行声明。外部变量声明的一般形式为 extern 类型名 外部变量,外部变量2;可通过对外部变量的声明将其作用域延伸到定义它的位置之前的函数中。,外部变量的定义和外部变量的声明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的声明,出现在要使用该外部变量的函数内,而且可以出现多次。外部变量在定义时分配内存单元,并可以初始化;外部变量声明时,不能再赋

7、初值,只是表明在该函数内要使用这些外部变量。如97页例题中b,c是外部变量的定义,d,e是外部变量的说明。,6.2.4 内部函数和外部函数 函数在本质上是全局的,因为一个函数需要被其他函数调用。那么,当一个源程序由多个源文件组成时,在一个源文件中定义的函数,能否被其他源文件中的函数调用呢?语言根据函数能否被其他源文件中的函数调用,将函数分为内部函数和外部函数。,6.2.4 内部函数 1内部函数的概念和定义 如果在一个源文件中定义的函数,只能被本源文件中的函数调用,而不能被同一程序中其他源文件中的函数调用,则这种函数称为内部函数。内部函数的作用域局限于定义它的源文件内部。定义一个内部函数,只需在

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

9、static,或冠以关键字extern,表示此函数是外部函数,如下所示:extern 类型名 函数名(参数定义表)函数体 与调用本源文件中的函数一样,需要对被调用的外部函数进行如下声明:extern 类型名 函数名(参数类型表),函数名2(参数类型表2);,6.3 变量的动态存储与静态存储6.3.1 动态存储与静态存储的概念 在C语言中,每个变量都有两个属性:数据类型和存储类型。存储类型是指变量在内存中存储的方式。各种变量的作用域不同,就其本质来说是因为变量的存储类型不同。变量的存储类型分为静态存储和动态存储两大类。,静态存储变量通常是在变量定义时就分配存储单元,并一直保持不释放,直至整个程序

10、运行结束才释放。前面介绍的外部变量即属于此类存储方式。动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。,由此可知,静态存储变量是一直存在的,而动态存储变量则时而存在、时而消失。这种由于变量存储方式的不同而产生的特性,称为变量的生存期。生存期表示了变量存在的时间。生存期和作用域分别从时间和空间这两个不同的角度描述了变量的特性。这两者既有联系,又有区别。一个变量究竟属于哪一种存储方式,并不能仅从其作

11、用域来判断,还应有明确的存储类型定义。因此,变量定义的完整形式应为 存储类型 数据类型 变量名,变量名2;,在C语言中,对变量的存储类型定义有以下四种:自动变量(auto)、寄存器变量(register)、外部变量(extern)和静态内部变量(static)。自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。对一个变量的定义,不仅应定义其数据类型,还应定义其存储类型。,static 数据类型 内部变量表;存储特点:(1)静态内部变量属于静态存储,是在编译时为其分配存储单元的,其生存期为整个程序执行期间。在程序执行过程中,即使所在函数被调用结束也不释放,一直存在。但

12、其他函数不能引用它们。(2)静态内部变量是在编译时赋初值的,若定义而不初始化,则自动赋以0(整型和实型)或0(字符型),也即系统会自动初始化为0值。每次调用静态内部变量所在的函数时,不再重新赋初值,只是保留上次调用结束时的值,如99页例题所示。,寄存器存储寄存器变量 一般情况下,变量的值都是存储在内存中的。为提高执行效率,语言允许将内部变量的值存放到寄存器中,这种变量称为寄存器变量。定义格式如下:register 数据类型 变量表;说明:只有内部变量和形参变量才能定义为寄存器变量,外部变量则不行。,【例6.7】输出14的阶乘。long factorial(int n)register long

13、 i,fact=1;/*定义寄存器变量*/for(i=1;i=n;i+)fact*=i;return(fact);main()int num;for(num=1;num=4;num+)printf(%d!=%ldn,num,factorial(num);,程序运行结果如下:1!=12!=23!=64!=24,6.3预处理程序6.3.1 文件包含文件包含是C语言预处理程序的一个重要功能。其命令行的一般形式为#include文件名 或#include 以前已多次用此命令包含过Turbo C库函数的头文件。例如:#includestdio.h 及#includemath.h,文件包含命令的功能是把指

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

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

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

17、照给定提示输出*/#include 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)宏定义是用宏名来表示一个字符串,在宏展开时又 以

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

19、各个形参。带参数宏调用的一般形式为 宏名(实参表);,例如:#define M(y)y*y+3*y/*宏定义*/k=M(5);/*宏调用*/在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为 k=5*5+3*5;,【例 6.8】/*程序功能:带参宏示例,实现自键盘输入两个数值的比较并输出较大值*/#define MAX(a,b)(ab)?a:bmain()int x,y,max;printf(input two numbers:);scanf(%d%d,程序运行情况:input two numbers:11 33 max=33 本例的第一行进行带参宏定义,用宏名MAX表示条件表达式(ab)?a:b,形参a,b均出现在条件表达式中。程序第六行“max=MAX(x,y);”为宏调用,实参x,y将代换形参a,b。宏展开后,该语句为 max=(xy)?x:y;用于计算x,y中的大数。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号