《全局变量作用域.ppt》由会员分享,可在线阅读,更多相关《全局变量作用域.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1回顾:模块化程序设计 1.1.主函数主函数,库函数和自定义函数的区别库函数和自定义函数的区别 2.2.自定义函数的定义自定义函数的定义、设计设计 3.3.递归函数的定义和用途递归函数的定义和用途回顾:模块化程序设计 uu课程目标:课程目标:课程目标:课程目标:了解变量作用域的概念了解变量作用域的概念了解变量作用域的概念了解变量作用域的概念掌握全局变量与局部变量的区别掌握全局变量与局部变量的区别掌握全局变量与局部变量的区别掌握全局变量与局部变量的区别(重点重点重点重点)掌握变量的存储类别掌握变量的存储类别掌握变量的存储类别掌握变量的存储类别(难点难点难点难点)参考课本参考课本参考课本参考课本
2、P168P168P168P168 P175 P175 P175 P175了解预编译的概念了解预编译的概念了解预编译的概念了解预编译的概念掌握宏的概念及掌握宏的概念及掌握宏的概念及掌握宏的概念及#define#define#define#define的使用的使用的使用的使用(重点重点重点重点)掌握文件包含及掌握文件包含及掌握文件包含及掌握文件包含及#include#include#include#include的使用的使用的使用的使用参考课本参考课本参考课本参考课本P230P230P230P230 P239 P239 P239 P2392本次课内容本次课内容 3 变量的变量的使用范围使用范围使用
3、范围使用范围与与存储类型存储类型存储类型存储类型 “变量变量变量变量”是指在程序运行过程中其值可以发生是指在程序运行过程中其值可以发生变化的量。通常是用来表示在程序中对数据存储空间变化的量。通常是用来表示在程序中对数据存储空间 的一种抽象的描述。的一种抽象的描述。当我们在学习当我们在学习C语言中的变量时,必须要掌握语言中的变量时,必须要掌握 变变量的有关属性:量的有关属性:1 1、变量的数据类型及其定义方法变量的数据类型及其定义方法变量的数据类型及其定义方法变量的数据类型及其定义方法 2 2、变量的初始化变量的初始化变量的初始化变量的初始化 3 3、变量的使用范围及其说明方法变量的使用范围及其
4、说明方法变量的使用范围及其说明方法变量的使用范围及其说明方法 4 4、变量的存储类别及其定义方法变量的存储类别及其定义方法变量的存储类别及其定义方法变量的存储类别及其定义方法一、一、变量的变量的使用范围使用范围与与存储类型存储类型 4变量的使用范围包括有变量的使用范围包括有变量的使用范围包括有变量的使用范围包括有在一个函数在一个函数在一个函数在一个函数内部内部内部内部使用的变量使用的变量使用的变量使用的变量-局部变量局部变量局部变量局部变量;在在在在 函函函函 数数数数 之之之之 外部外部外部外部 使用的变量使用的变量使用的变量使用的变量-全局变量全局变量全局变量全局变量;main()main
5、()int a,b;int a,b;在一个函数内部定义的变量称为局部变量在一个函数内部定义的变量称为局部变量 int fun(int int fun(int x)int i,j;int i,j;局部变量局部变量 局部变量局部变量 1、局部变量、局部变量1.1 1.1 变量的变量的使用范围使用范围使用范围使用范围:局部变量局部变量局部变量局部变量 5 1 1、主函数中定义的变量也只用在主函数中有效;、主函数中定义的变量也只用在主函数中有效;、主函数中定义的变量也只用在主函数中有效;、主函数中定义的变量也只用在主函数中有效;关于局部变量使用的几点说明 2 2、不同函数中可以使用相同的变量名,且它们
6、代、不同函数中可以使用相同的变量名,且它们代、不同函数中可以使用相同的变量名,且它们代、不同函数中可以使用相同的变量名,且它们代 表不同的存储单元,互不干扰;表不同的存储单元,互不干扰;表不同的存储单元,互不干扰;表不同的存储单元,互不干扰;3 3、形式参数也是局部变量。其它函数是不能调用、形式参数也是局部变量。其它函数是不能调用、形式参数也是局部变量。其它函数是不能调用、形式参数也是局部变量。其它函数是不能调用 该形参的;该形参的;该形参的;该形参的;4 4、在一个函数内部,可以在复合语句中定义变量、在一个函数内部,可以在复合语句中定义变量、在一个函数内部,可以在复合语句中定义变量、在一个函
7、数内部,可以在复合语句中定义变量 ,这些变量只能在本复合语句中有效。,这些变量只能在本复合语句中有效。,这些变量只能在本复合语句中有效。,这些变量只能在本复合语句中有效。1.1.1 关于局部变量使用的几点说明 6在函数内部(包括主函数)定义的变量,称为局在函数内部(包括主函数)定义的变量,称为局部变量,其作用范围只在函数内部有效,如下代码部变量,其作用范围只在函数内部有效,如下代码#include void fund1(void)int nX=100;/局部变量局部变量 printf(“nX in fund1=%dn”,nX);void fund2(void)int nX=200;/局部变量局
8、部变量 printf(“nX in fund2=%dn”,nX);void main(void)int nX=50;/局部变量局部变量 printf(nX in main=%dn”,nX);fund1();fund2();程序代码程序代码本例中定义了三个局部变量本例中定义了三个局部变量nX,nX,其作用范围分别作用于其作用范围分别作用于fund1,fund fund1,fund 和和mainmain函数函数打印结果:打印结果:nX in main=50nX in main=50nX in fund1=100nX in fund1=100nX in fund2=200nX in fund2=20
9、0示例:示例:局部变量局部变量示例:示例:局部变量局部变量 7char c1,c2;char c1,c2;int p=1,q=5;int p=1,q=5;main()main()int a,b;int a,b;a=p;b=q;a=p;b=q;在在函数之外定义的变量函数之外定义的变量函数之外定义的变量函数之外定义的变量 称为称为称为称为 全局变量全局变量全局变量全局变量 全局变量可以为本文件中全局变量可以为本文件中其它函数所共用其它函数所共用。它的使用范围它的使用范围:从定义变量的位置开始到本源程序文件结束从定义变量的位置开始到本源程序文件结束 全局变量全局变量 f1(int x)f1(int
10、x)int i,j,z;int i,j,z;z=p+x;z=p+x;f2(int y)f2(int y)char ch=a,c2=b;char ch=a,c2=b;c1=ch;ch=c2;c1=ch;ch=c2;2、全局变量1.21.2 变量的变量的使用范围使用范围使用范围使用范围:全局变量全局变量 8 1、若在同一个源文件中,如有全局变量与局部、若在同一个源文件中,如有全局变量与局部 变量同名时,则在局部变量的作用范围内,变量同名时,则在局部变量的作用范围内,全局变量不起作用。全局变量不起作用。2、设置全局变量的作用是、设置全局变量的作用是:增加函数间数据联系的渠道。增加函数间数据联系的渠道
11、。由于同一个文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其它函数,相当于各个函数间有直接的传递通道。关于全局变量使用的几点说明1.2.1 关于全局变量使用的几点说明 9示例:全局变量int d=1;int d=1;main()main()int a=3;int a=3;fun(a);d+=a+;fun(a);d+=a+;printf(“%dn”,d);printf(“%dn”,d);fun(int p)fun(int p)int d=5;int d=5;d+=p+;d+=p+;printf(“%dn”,d);printf(“%dn”,d);retur
12、n;return;1 1 d d3 3 a a3 3 p p5 5d d8 84 48 84 44 4示例:全局变量 10#include int nX=999;/全局变量全局变量 void fund1(void)printf(“nX in fund1=%dn”,nX);void fund2(void)int nX=0;/局部变量局部变量 printf(“nX in fund2=%dn”,nX);void main(void)printf(nX in main=%dn”,nX);fund1();fund2();程程 序序 代代 码码 在此范围中,局部在此范围中,局部变量变量nX的作用范围替的作
13、用范围替代了全局变量代了全局变量nX的作的作用范围。用范围。本例中函数本例中函数fund2fund2中的中的nXnX作用作用范围与全局变量范围与全局变量nXnX有重叠部有重叠部分,在重叠部分中使用局部分,在重叠部分中使用局部变量,屏蔽掉了全局变量变量,屏蔽掉了全局变量打印结果:打印结果:nX in main=999nX in main=999nX in fund1=999nX in fund1=999nX in fund2=0nX in fund2=0变量作用范围重叠问题1.2.2 变量作用范围重叠问题 11 数数数数 据据据据 区区区区(动态动态)数数数数 据据据据 区区区区(静态静态)内存
14、存储区存储区 程程程程 序序序序 区区区区 在程序运行期间分配固定 的存储空间(如 全局变量)。静静静静态态态态数数数数据据据据区区区区动动动动态态态态数数数数据据据据区区区区 只有当函数被调用时才开始分配存储空间,在函数执行结束时就释放这些空间。在程序执行过程中,这种分配和释放是动态的(如 局部变量)。内存存储区内存存储区 12 在C语言中,每一个变量和函数有两个属性:数据类型数据类型和数据的存储类别存储类别。数据类型,如整型、实型等;存储类别,指的是数据在计算机中的存储方式,也可以说数据的 存储地点存储地点。内存内存内存内存储储储储器器器器 (memory)(memory)寄寄寄寄存存存存
15、器器器器(CPU)(CPU)变量的存储类型1.3、变量的存储类型 13 关键词关键词 auto 函数中的局部变量通常默认为动态分配存储空间的,即存储在动态存储区中。对它们分配和释放空间都是由编译系统自动处理的,因此这类局部变量也称为自动变量自动变量。动动动动态态态态存存存存储储储储auto int b=1,c=2;auto int b=1,c=2;1、局部变量的存储方式、局部变量的存储方式:auto1.3.11.3.1 局部变量的存储方式局部变量的存储方式局部变量的存储方式局部变量的存储方式:auto:auto 14 关键词关键词 static 有时希望函数中的局部变量的值在函数调用结束后不消
16、失不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。静静静静态态态态存存存存储储储储 static int b=1,c=2;int b=1,c=2;2 2、局部变量的存储方式:、局部变量的存储方式:、局部变量的存储方式:、局部变量的存储方式:staticstatic1.3.21.3.2 局部变量的存储方式:局部变量的存储方式:局部变量的存储方式:局部变量的存储方式:staticstatic参见源码参见源码:9_1 exp0901 15 int f(int a)f(int a)auto auto int b b=0;static sta
17、tic int c c=3;b=b+1;c=c+1;return(a+b+c);main()main()int a=2,i;int a=2,i;for(i=0;i 3;i+)for(i=0;i 3;i+)printf(“%dn”,f(a);printf(“%dn”,f(a);0 0b b3 3c c1 12 2a a2 2a a4 47 70 01 15 58 80 06 69 9示例:局部变量的存储方式示例:局部变量的存储方式示例:局部变量的存储方式示例:局部变量的存储方式 16 1 1、当需要保留函数上一次调用结束时的值、当需要保留函数上一次调用结束时的值、当需要保留函数上一次调用结束时的
18、值、当需要保留函数上一次调用结束时的值;2 2、如果初始化后,变量只被引用而不改变其值,则这、如果初始化后,变量只被引用而不改变其值,则这、如果初始化后,变量只被引用而不改变其值,则这、如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较方便,以每次调用时重新赋值。时用静态局部变量比较方便,以每次调用时重新赋值。时用静态局部变量比较方便,以每次调用时重新赋值。时用静态局部变量比较方便,以每次调用时重新赋值。main()main()int i;int i;for(i=1;i=5;i+)for(i=1;i=5;i+)printf(“%d!=%dn”,printf(“%d!=%dn”,i
19、,i,fac(i);fac(i);int int fac(int n)fac(int n)static int t=1;static int t=1;t=t*n;t=t*n;return(t);return(t);1!=11!=12!=22!=23!=63!=64!=244!=245!=1205!=120局部变量的用途局部变量的用途1.3.3 局部变量的用途局部变量的用途 17 全局变量的扩展扩展调用。我们知道一个C 语言程序可以有一个或多个源程序文件组成。如果程序是由多个源文件组成时,为了保障某个全局变量能提供多个源文件中的函数调用,则可采全局变量的扩展调用。关键词关键词 extern 只能
20、用来定义全局变量只能用来定义全局变量只能用来定义全局变量只能用来定义全局变量 int x;int x;main()main()a1.ca1.c char cc;char cc;extern int x;extern int x;a2.ca2.c extern char cc;extern char cc;a3.ca3.c3、全局变量的扩展调用 extern1.4 全局变量的扩展调用 extern参见源码参见源码:9_1 exp0902 u如果一个函数只能被它所在文件中的其他函数所调用,则称为内部函数或静态函数内部函数或静态函数,如:uStatic int fun(int a,int b).u在
21、多文件组成的程序中,如果在一个源程序文件中定义的函数,除了能在本程序内使用,还可以在其他源程序文件中使用.如:uExtern int fun(int a,int b)u外部函数不用引用头文件.18内部函数和外部函数1.4.1 内部函数和外部函数参见源码参见源码:9_1 exp0903 19 但是,在有些情况下需要某些变量中的值频繁地读写(如某循环变量需要执行10000次循环,显然为了读写变量的值就需要花费许多的时间。因此,为了提高程序的执行效率,在C语言中允许将这些变量的值可以储存在CPU中的寄存器中,需要时可直接从寄存器中读出参加运算,而不必再到内存中去读写。由于寄存器的存取速度远高于内存的
22、存取速度,因此可以提高执行效率。这种变量称为“寄存器变量”。寄寄存存器器 CPU CPU 运算器运算器 关键词关键词 register register int a,b;register int a,b;int fac(int n)registerregister int i,f=1;for(i=1;i=n;i+)f=f*i;return(f);4、使用寄存器变量 register1.5 使用寄存器变量 register 20 运算器运算器运算器运算器 一般情况下,变量(包括静态和动态)的值都是存放在内存中的,当程序中用到哪一个变量的值时,则由控制器发出指令将内存中该变量的值送到运算器中进行运
23、算,之后再将运算结果送回内存中存放。内内内内 存存存存 寄存器存储区(了解)1.5.1 寄存器存储区(了解)211 1、只有只有 局部自动变量局部自动变量局部自动变量局部自动变量 和和 形参形参形参形参 可以作为寄存器变量可以作为寄存器变量。寄存器变量使用的几点说明5 5、局部静态、局部静态、局部静态、局部静态 变量变量不能不能不能不能作为寄存器变量。作为寄存器变量。register static int a,b,c;register static int a,b,c;不能把变量 a,b,ca,b,ca,b,ca,b,c 既放在静态存储区中,又放在寄存器中,二者只能居其一。对于一个变量只能定义
24、为一个存储类别。2 2、对于占用字节数多的变量,如对于占用字节数多的变量,如:longlong、floatfloat、doubledouble 型变量型变量 不能不能不能不能 说明为寄存器型变量。说明为寄存器型变量。3 3、由于寄存器中的数据可以直接访问,因此比其它存储类别的变由于寄存器中的数据可以直接访问,因此比其它存储类别的变 量量运算速度要快运算速度要快运算速度要快运算速度要快。所以对于。所以对于反复使用反复使用反复使用反复使用的变量均可作为寄存的变量均可作为寄存器变量。器变量。4 4、寄存器型变量都是在某个函数中定义的,所以一旦退出该函数后就会寄存器型变量都是在某个函数中定义的,所以一
25、旦退出该函数后就会 被被 释放释放释放释放。1.5.2 寄存器变量使用的几点说明 22序号序号序号序号存储类型存储类型存储类型存储类型存储类别存储类别存储类别存储类别标识符标识符标识符标识符存储地点存储地点存储地点存储地点1 1 2 2 3 3 4 4 自动型自动型 auto 内存动态数据区内存动态数据区 CPU CPU 中的通用寄存器中的通用寄存器 内存静态数据区内存静态数据区 静态型静态型 寄存器型寄存器型 扩展型扩展型 register static extern 内存静态数据区内存静态数据区存储类别标识符表1.6 存储类别标识符表 23预编译语句是在程序编译之前由编译器进行的源代码处理
26、工作。处理完成后的源代码再进入编译工作。C+语言提供的预编译语句主要有以下三种:宏定义宏定义文件包含文件包含条件编译条件编译 预编译指令预编译指令均以均以“#”号标识号标识注意注意预编译语句二、预编译语句 24定义一般形式:定义一般形式:#define#define 标识符标识符 字符串字符串取消宏定义取消宏定义:#undef#undef 标识符标识符 作用:在预处理过程中将源程序中的标识符替换成字符串作用:在预处理过程中将源程序中的标识符替换成字符串例:例:#include#define WM “Welcom”#define UINT unsigned int#define PI 3.141
27、59void main(void)printf(WM);UINT na=100;UINT nb=200;double dbA=PI*na*na;源源 程程 序序 代代 码码#include void main(void)printf(“Welcom”);unsigned int na=100;unsigned int nb=200;double dbA=3.14159*na*na;预预 编编 译译 后后 的的 源源 程程 序序 代代 码码编译预处理编译预处理宏定义-#define指令2.1 宏定义-#define指令参见源码参见源码:exp0904exp0906 25文件包含预处理控制有两种形
28、式文件包含预处理控制有两种形式:#include /包含系统标准库文件#include“filename”/包含自定义文件作用:作用:在预处理过程中用包含文件的内容取代在预处理过程中用包含文件的内容取代#include#include命令命令.例:例:#include#include“test.h”void main(void)int na=nV;double dba=dbV;源源 程程 序序 代代 码码#include int nV=10;double dbV=0.5;void main(void)int na=nV;double dba=dbV;预预 编编 译译 后后 的的 源源 程程 序
29、序 代代 码码编译预处理编译预处理test.h文件包含-#includeint nV=10;double dbV=0.5;2.2 文件包含-#include参见源码参见源码:exp0907 本次课课程总结1全局变量及局全局变量及局部变量的作用部变量的作用域域2变量的变量的4种存储种存储类型类型3预编译概念,预编译概念,defineinclude的使用的使用 作业布置与要求 1、设计一个程序,定义带参数的宏、设计一个程序,定义带参数的宏MAX(A,B)和和MIN(A,B),分别求出两数中的大数和小数。),分别求出两数中的大数和小数。在主函数中输入三个数,并求出这三个数中的最大值和最小值。在主函数中输入三个数,并求出这三个数中的最大值和最小值。2、论述题论述题.(见见09-变量作用域和预编译习题变量作用域和预编译习题.doc)预习一维数组元素的访问 2冒泡排序算法 4一维数组的定义,初始化 3 1选择排序选择排序法 3 3
限制150内