《第七章 变量的作用域与存储方式精选PPT.ppt》由会员分享,可在线阅读,更多相关《第七章 变量的作用域与存储方式精选PPT.ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章 变量的作用域与存储方式第1页,本讲稿共20页变量的属性变量的属性数据类型数据类型:变量所持有的数据的性质(:变量所持有的数据的性质(操作属性操作属性)存储属性存储属性:存储器类型:存储器类型:寄存器、静态存储区、动态存储区寄存器、静态存储区、动态存储区生存期生存期:变量在某一时刻存在:变量在某一时刻存在静态变量与动静态变量与动 态变量态变量作用域作用域:变量在某区域内有效:变量在某区域内有效局部变量与全局部变量与全 局变量局变量变量定义格式:变量定义格式:存储类型存储类型 数据类型数据类型 变量表变量表;例:例:int sum;extern int a,b,c;register int
2、 i;static float x,y;第2页,本讲稿共20页变量的作用域变量的作用域w变量的作用域:变量有效的范围。变量的作用域:变量有效的范围。w语言中所有的变量都有自己的作用域。语言中所有的变量都有自己的作用域。w变量说明的方式不同,其作用域也不同。变量说明的方式不同,其作用域也不同。w语言的变量,按作用域范围可分为两种:语言的变量,按作用域范围可分为两种:局部变量和全局变量。局部变量和全局变量。第3页,本讲稿共20页局部变量局部变量内部变量内部变量w定义:在函数内定义,只在本函数内有效定义:在函数内定义,只在本函数内有效w说明:说明:main中定义的变量只在中定义的变量只在main中有
3、效中有效不同函数中同名变量,占不同内存单元不同函数中同名变量,占不同内存单元形参属于局部变量形参属于局部变量可定义在复合语句中有效的局部变量可定义在复合语句中有效的局部变量float f1(int a)int b,c;.char f2(int x,int y)int i,j;main()int m,n;.a,b,c有效有效x,y,i,j有效有效m,n有效有效第4页,本讲稿共20页例:不同函数中同名变量例:不同函数中同名变量main()int a,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub
4、()int a,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);运行结果:运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4第5页,本讲稿共20页全局变量全局变量外部变量外部变量n定义:在函数外定义,可为本文件所有函数共用。定义:在函数外定义,可为本文件所有函数共用。n有效范围:从定义变量的位置开始到本源文件结束,及有效范围:从定义变量的位置开始到本源文件结束,及有有extern声明的其它源文件。声明的其它源文件。应尽量少使用全局变量,因为:应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元全局变量在程序全部执行过程中占
5、用存储单元降低了函数的通用性、可靠性,可移植性降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错降低程序清晰性,容易出错 定义定义 声明声明次数:次数:只能只能1次次 可声明多次可声明多次位置:位置:所有函数之外所有函数之外 函数内或函数外函数内或函数外分配内存:分配内存:分配内存分配内存,可初始化可初始化 不分配内存不分配内存,不可初始化不可初始化 外部变量声明:外部变量声明:extern 数据类型数据类型 变量表;变量表;外部变量定义与外部变量声明不同外部变量定义与外部变量声明不同 若外部变量与局部变量同名,则外部变量被屏蔽若外部变量与局部变量同名,则外部变量被屏蔽第6页,本讲稿
6、共20页int a=3,b=5;max(int a,int b)int c;c=ab?a:b;return(c);main()int a=8;printf(max=%d,max(a,b);例:外部变量与局部变量例:外部变量与局部变量运行结果:运行结果:max=8例:外部变量定义与声明例:外部变量定义与声明extern int a,b;int max()int z;z=ab?a:b;return(z);main()printf(max=%d,max();int a=13,b=-8;外部变量定义及初始化外部变量定义及初始化外部变量声明外部变量声明运行结果:运行结果:max=13第7页,本讲稿共20
7、页int p=1,q=5;float f1(int a)int b,c;.int f3().char c1,c2;char f2(int x,int y)int i,j;main()int m,n;.c1,c2的作用范围的作用范围p,q的作用范围的作用范围extern char c1,c2;extern char c1,c2;c1,c2的的作作用用范范围围扩扩展展后后c1,c2的的作作用用范范围围扩扩展展后后第8页,本讲稿共20页main()void gx(),gy();extern int x,y;printf(“1:x=%dty=%dn”,x,y);y=246;gx();gy();void
8、 gx()extern int x,y;x=135;printf(“2:x=%dty=%dn”,x,y);int x,y;void gy()printf(“3:x=%dty=%dn”,x,y);例:用例:用extern扩展外部变量作用域扩展外部变量作用域运行结果:运行结果:1:x=0 y=02:x=135 y=2463:x=135 y=246第9页,本讲稿共20页引用其它文件中的外部变量引用其它文件中的外部变量int global;extern float x;main()int local;.extern int global;static int number;func2().float
9、x;unc3()extern int global;.file1.cfile2.cfile3.c第10页,本讲稿共20页变量的存储类型变量的存储类型程序区程序区静态存储区静态存储区动态存储区动态存储区全局变量、局部静态变量全局变量、局部静态变量形参变量形参变量局部动态变量(局部动态变量(auto register)函数调用现场保护和返回地址等函数调用现场保护和返回地址等内存用户区内存用户区第11页,本讲稿共20页n动态变量与静态变量动态变量与静态变量存储方式存储方式w静态存储:程序运行期间分配固定存储空间静态存储:程序运行期间分配固定存储空间w动态存储:程序运行期间根据需要动态分配存储空间动态
10、存储:程序运行期间根据需要动态分配存储空间 生存期生存期 静态变量:从程序开始执行到程序结束静态变量:从程序开始执行到程序结束 动态变量:从包含该变量定义的函数开始执行至函数动态变量:从包含该变量定义的函数开始执行至函数执行结束执行结束 变量的存储类型变量的存储类型auto -自动型自动型register-寄存器型寄存器型static -静态型静态型extern -外部型外部型第12页,本讲稿共20页n变量存储类型变量存储类型静态静态动态动态存储方式存储方式程序整个运行期间程序整个运行期间函数调用开始至结束函数调用开始至结束生存期生存期编译时赋初值,编译时赋初值,只赋一次只赋一次 每次函数调用
11、时每次函数调用时赋初值赋初值自动赋初值自动赋初值0或空字符或空字符不确定不确定未赋初值未赋初值静态存储区静态存储区动态区动态区存储区存储区寄存器寄存器局部变量局部变量外部变量外部变量作用域作用域定义变量的函数或复合语句内定义变量的函数或复合语句内本文件本文件其它文件其它文件局部变量默认为局部变量默认为auto型型register型变量个数受限型变量个数受限,且不能为且不能为long,double,float型型局部局部static变量具有变量具有全局寿命全局寿命和和局部可见性局部可见性局部局部static变量具有变量具有可继承性可继承性extern不用于变量定义不用于变量定义,可扩展外部变量作
12、用域可扩展外部变量作用域register局部局部staticauto外部外部static外部外部存储类别存储类别第13页,本讲稿共20页例:文件例:文件file1.cint a;main().f2;.f1;.f1()auto int b;f2;.f2()static int c;C作用域作用域b作用域作用域a作用域作用域mainf2f1mainf1f2maina生存期生存期:b生存期生存期:c生存期生存期:第14页,本讲稿共20页main()void increment(void);increment();increment();increment();void increment(void)
13、int x=0;x+;printf(“%dn”,x);例:局部静态变量值具有可继承性例:局部静态变量值具有可继承性运行结果:运行结果:1 1 1main()void increment(void);increment();increment();increment();void increment(void)static int x=0;x+;printf(“%dn”,x);运行结果:运行结果:1 2 3第15页,本讲稿共20页例:变量的寿命与可见性例:变量的寿命与可见性#include int i=1;main()static int a;register int b=-10;int c=0
14、;printf(-MAIN-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);c=c+8;other();printf(-MAIN-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);i=i+10;other();other()static int a=2;static int b;int c=10;a=a+2;i=i+32;c=c+5;printf(-OTHER-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);b=a;-Main-i:1 a:0 b:-10 c:0-Other-i:33 a:4 b:0
15、c:15-Main-i:33 a:0 b:-10 c:8-Other-i:75 a:6 b:4 c:15全局全局i1main:a0b:-10registermain:c0静态静态存储区存储区动态动态存储区存储区other:a2other:b0other:c10843315443other:c10675156第16页,本讲稿共20页内部函数和外部函数内部函数和外部函数w函数一旦定义后就可被其它函数调用。函数一旦定义后就可被其它函数调用。但当一个但当一个源程序由多个源文件组成时,源程序由多个源文件组成时,在一个源文件中定在一个源文件中定义的函数能否被其它源文件中的函数调用呢义的函数能否被其它源文件
16、中的函数调用呢?w语言把函数分为两类:语言把函数分为两类:n内部函数内部函数n外部函数外部函数第17页,本讲稿共20页内部函数内部函数w如果在一个源文件中定义的函数只能被本文件中的如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数函数调用,而不能被同一源程序其它文件中的函数调用,调用,这种函数称为内部函数。这种函数称为内部函数。w定义内部函数的一般形式是:定义内部函数的一般形式是:static 类型说明符类型说明符 函数名函数名(形参表形参表)例如:例如:static int f(int a,int b)w内部函数也称为静态函数。但此处静态内部函数也称为静
17、态函数。但此处静态static 的含的含义已不是指存储方式,而是指对函数的调用范围义已不是指存储方式,而是指对函数的调用范围只局限于本文件。只局限于本文件。第18页,本讲稿共20页外部函数外部函数w外部函数在整个源程序中都有效,其定义的一般形式为:外部函数在整个源程序中都有效,其定义的一般形式为:extern 类型说明符类型说明符 函数名函数名(形参表形参表)例如:例如:extern int f(int a,int b)w如在函数定义中没有说明如在函数定义中没有说明extern或或static则隐含为则隐含为extern。在一个源文件的函数中调用其它源文件中定义的外部函数在一个源文件的函数中调
18、用其它源文件中定义的外部函数时,应时,应 用用extern说明被调函数为外部函数。说明被调函数为外部函数。第19页,本讲稿共20页小结小结w可从三个方面对变量分类,即变量的数据类型,可从三个方面对变量分类,即变量的数据类型,变量作用域和变量的存储类型。在第二章中主要变量作用域和变量的存储类型。在第二章中主要介绍变量的数据类型,本章中介绍了变量的作用介绍变量的数据类型,本章中介绍了变量的作用域和变量的存储类型。域和变量的存储类型。w变量的作用域是指变量在程序中的有效范围,变量的作用域是指变量在程序中的有效范围,分为局部分为局部变量和全局变量。变量和全局变量。w变量的存储类型是指变量在内存中的存储方式,分为变量的存储类型是指变量在内存中的存储方式,分为静态存储和动态存储,表示了变量的生存期。静态存储和动态存储,表示了变量的生存期。第20页,本讲稿共20页