存储类别和作用域

上传人:hy****d 文档编号:243024768 上传时间:2024-09-14 格式:PPT 页数:32 大小:97.50KB
返回 下载 相关 举报
存储类别和作用域_第1页
第1页 / 共32页
存储类别和作用域_第2页
第2页 / 共32页
存储类别和作用域_第3页
第3页 / 共32页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+程序设计,第二讲 4.6 存储类别和作用域,版本号:V2009.08,1,4.6 存储类别和作用域,变量的,作用域,:是指变量在程序中有效的空间范围,变量的作用域与定义变量的位置有关;,变量的,生存期,:指的是变量生成到变量空间释放的时间范围,变量的生存期与变量的存储类别相关。,C+可将作用域分为五种:块作用域、文件作用域、函数原型作用域、函数作用域和类作用域。,2,1. 块作用域,块:,就是用花括号括起来的那部分程序。在块内说明的标识符只能在该块内引用,即其作用域在块内。所有函数体内定义的变量都具有块作用域。,在一个函数内或块内定义的变量被称为局部变量;对于块中嵌套其他块的情况,如果嵌套块中有同名局部变量,服从局部优先原则,即在内层块中屏蔽外层块中的同名变量。,在,函数原型作用域,和,函数作用域,内定义的变量 都属于局部变量;,3,【例4.12】局部变量的屏蔽。,#include ,void main(),int i=5;,couti1=in; /A,int i;,i=7;,couti2=in; /B,couti3=in; /C,return;,运行结果是:,i1=5,i2=7,i3=5,4,2. 文件作用域,在所有函数外定义的变量称为全局变量,全局变量的作用域称为文件的作用域;,当局部变量与全局变量同名时,局部变量(块作用域内的变量)优先。它与块作用域不同的是:在块作用域内可通过域运算符“:”来引用与局部变量同名的全局变量。,5,【例4.13】在块作用域内引用文件作用域中的同名全局变量。,#include ,int i=0;/A,void main(),int i=5;/B,couti;/C,int i=7;/D,cout i; /E,cout:i;/F,程序运行后结果为:,570,6,462 变量的存储类别,操作系统为一个C+程序的运行所分配的内存分为4个区域,如图4.2所示。,代码区:存放程序代码,即程序中各个函数的代码块,静态数据区:存放程序的全局数据和静态数据,栈区:存放程序中的局部变量,如函数中的局部变量等,堆区:存放动态分配的数据。,堆区,(动态数据),栈区,(函数局部数据),main()函数局部数据,静态数据区,(全局变量、静态变量),代码区,(程序代码),图4.2 程序在内存中的区域,7,C+使用四种说明符auto(自动类型)、register(寄存器类型)、static(静态类型)和extern(外部类型)来确定变量的存储类型。加上变量的作用域的不同,在C+中变量共有下列5种存储形式:,局部变量、全局变量、外部变量、静态变量、寄存器变量;,8,在函数或块内部说明的变量称为局部变量(如形参变量),由于建立和撤消这些变量是由系统自动完成,因此这类变量又称为自动型变量。,注意:,a: 局部变量仅由说明它的函数或块的内部语句所访问;换言之,局部变量在定义自己的函数或块之外是不可见的。,b: 局部变量在进入函数时生成,退出时消亡。因此局部变量的生存期仅存在于被定义的函数或块中。,1、 自动存储变量(局部变量,属于auto型),9,#include,void func1( );,void func2( );,void func1( ), int x;,x = 10;,coutxt;,void main(void ), int x = 20;,func1( );,func2( );,cout x;,void func2( ), int x;,x = -199;,coutxt;,10,程序说明:,整形变量x被说明了3次,一次在func1中, 另一次在func2和main中, func1和func2中的x互不相关,也就是说,局部变量的值不能在两次调用之间保持。在C语言中,必须在函数或语句块的开头先于其它任何语句说明所有的局部变量。但在C+中,只需在变量使用之前说明就可以了。(结果为: 10 -199 20),11,与局部变量不同,全局变量在任何函数之外说明,包括main函数,并且可被任何一个函数使用。全局变量将在整个程序运行期间保持有效,同时可被函数内的任何表达式访问。说明全局变量的最佳位置在程序的一开始。,2、全局变量,12,#include,int count;,void func1( );,void func2( );,void func1( ), int temp;,temp = count;,func2( );,cout“count is: ” temp;,void main(void), count = 100;,func1( );,exit(0);,void func2( ), int count;,for(count=1;count10;count+),cout.put(。);,13,全局变量count既不在main( )中说明,也不在func1( )中说明,但可以在两者中被访问。函数func2中也说明了一个同名的局部变量count,但func2访问count时,仅访问自己说明的局部变量count,而不是那个全局变量count。,注意:,全局变量和某一函数的局部变量同名时,在函数内对该名的访问权仅针对局部变量,对全局变量无任何影响。程序执行结果为:,。count is 100 / 9个“。”,程序分析:,14,使用全局变量应注意的几点:,不论是否需要,全局变量在整个程序执行期间均占用固定的内存空间。,在使用局部变量就可以达到其功能时,应避免使用全局变量,这样可以提高函数的通用性。,大量使用全局变量时,可能导致不期望的副作用。例如,变量值在程序其它地点的偶然改变,将在程序的整个生存期内有效。,15,由于C+语言支持分离编译,既一个完整的C+语言程序可以由多个独立的文件组成,每个文件可以分别单独编译,然后再由链接程序完成程序组装。因此必须将程序需要的所有全局变量通过某种方法告诉所有的独立文件。方法就是在一个文件中说明所有全局变量,在其它文件中用extern再次描述它们。因此外部变量定义是:,由extern说明的全局变量称为外部变量。,3、外部变量,16,文件1,int x, y;,char ch;,Void main (void ),.,文件2,extern int x, y;,extern char ch;,void func22( ),x = y/10;,void func1( ),x = 123;,void func23( ),y = 10;,程序分析:在文件2中,全局变量表是从文件1中复制过来的,并将分类符extern加在说明之前。extern告诉编译程序,如下变量的类型和名字已在别处说明过了。,17,稳定的具有固定的内存地址的变量称为静态变量,;,( 或:用static 修饰的变量);,静态变量不象动态变量是在程序执行过程中被动态建立、动态撤消的。,静态变量的定义格式为:,static 变量类型 变量列表;,静态变量又可分为,静态局部变量,和,静态全局变量,。,静态局部变量:,是指定义在模块内部的静态变量。,它与局部变量的共同点是:,都是局限于某个模块内部;,仅在该模块内是有效的;,4、静态变量,18,局部变量仅存在于该模块被调用时,函数退出后,该变量就消失了。因此,它没有连续性,在末赋初值时,其值不定;而静态局部变量是始终存在的,即使退出该模块,变量仍然有效。这是因为它在内存中占有固定的单元,在多次调用该模块时,可以保持此变量的连续性。,它们的不同点是:,19,#include,void abc( int x, int y, int z);,void main(void ), int i, j, k;,i = 5; j = 10;,for(k = 1; k=5; k+),abc( i, j, k);,void abc(int x, int y, int z),int m;,static int n;,if( z = 1), m = 0; n = 0; ,else, m,+= x + y;,n += x + y;,coutm = m,n = nn;,例:说明静态局部变量与局部变量的区别;,20,在上例中,函数abc( )中的if语句,if(z = 0) m = 0; n = 0; ,是为了同时给m , n 赋值。然而多次调用函数abc( ),n的初值在起作用,保持了连续性。而m 初值没有起作用,没有连续性。,语句 m,+= x + y; 在z != 1以后的多次调用中,结果为不确定(因为没有被赋值)。,程序运行结果:,m = 0, n = 0;,m = *, n = 15,m = *, n = 30;,m = *, n = 45;,m = *, n = 60;,其中 * 表示不确定值。,程序说明:,21,用static修饰全局变量称为静态全局变量。静态全局变量与全局变量在形式上类似,但意义不同。静态全局变量只在它被定义的源文件中是有效的(该文件可以有几个函数),而在任何别的源文件中则是无效的。而全局变量通过extern修饰后可以作用于一个程序的多个源文件中。,静态全局变量,:,22,例:文件1,static int i=5;,int j=10;,void main(void) ,int k1, k2;,k1 = f1(i, j);,k2 = f2(i, j);,coutk1=k1,k2=k2endl;,f1(int x, int y) ,int z;,z = x + y + i;,return (z);,文件2,extern int j;,f2(int a, int b) ,int c;,c = a*b+j;,return(c);,运行结果: k1 = 20, k2 = 60;,23,程序说明:,这个程序有三个函数:main, f1, f2。其中函数f2单独作为一个文件,main和f1为另一个文件。程序中用一个静态全局变量i和一个全局变量j。因此变量j既可以在文件1中使用,也可以在文件2中通过extern说明使用。然而,变量i是静态全局变量,它只能在文件1中使用,即在函数main和函数f1中使用。,24,C+语言提供了一种仅用于int和char类型变量的存储分类符register,(因为通常寄存器是16位或32位字长)。,它的定义是:用register修饰的局部变量称为寄存器变量。,几点注意:,分类符,register,要求编译系统将它所说明的变量值保存在,CPU,寄存器中,而不是象普通变量那样存放在内存单元中,此时由于对变量的存取不必访问内存,因此运算速度大大快于普通变量的运算。这一类变量常用于循环控制部分;,分类符,register,仅可用于局部变量和函数的形式参数,因为这些变量都是缺省的自动变量。全局的,register,变量是不允许的;,5、寄存器变量,25,因为,register,变量存放在,CPU,的寄存器中,所以它没有地址,也就是说,不能用地址操作符,&,对,register,变量进行地址操作;,一个函数中所允许的寄存器变量的数目取决于处理器类型以及所指定的,C+,编译系统。若程序中寄存器变量的数量超过极限时,编译系统可能自动将它们转换成自动变量,从而保证了程序的可移植性;,26,int_pwr(int m , register int e),register int temp;,temp = 1;,for( ; e ; e-),temp = temp * m;,return(temp);,程序说明:,其中e和temp因用在循环中而又都说明为register变量,由于register变量可以提高速度,因此它是最理想的循环控制变量。,例:求M的e次幂。,27,最后总结:,全局变量和静态变量只在程序的开始一次生成;,局部变量和寄存器变量在进入定义它们的程序块和每个入口多次生成;,没有赋值的局部变量和寄存器变量在第一个赋值语句之前是末知的。,例1:不同存储类变量的应用;,例2:自动类与局部静态类变量的应用;,例3:由多个文件组成的程序中变量的作用域;,28,#include,#include,int i=1;,void other(void);,void main(void) ,static int a;,register int b=-10;,int c=0;,couti:a:b:c:endl;,coutisetw(8)asetw(8)bsetw(8)cendl;,/例:不同存储类型变量的应用,c += 8;,other( );,coutisetw(8)asetw(8)bsetw(8)cendl;,i += 10;,other( ); ,void other(void) ,static int a=2;,static int b;,int c=10;,a += 2;,i += 32;,c += 5;,coutisetw(8)asetw(8)bsetw(8)cendl;,b = a;,29,void other(void),static int a=2;,static int b;,int c=10;,a += 2;,i += 32;,c += 5;,coutisetw(8)asetw(8)bsetw(8)cendl;,b = a;,30,#include,int f1(register);,int f2(register);,void main(void) ,int i, re1, re2;,for(i=0;i5;i+) ,re1 = f1(i);,re2 = f2(i);,coutf1( ) last returned re1n,f2( ) last returned re20;i-) +k;,return(k);,int f2(register i),static int k;,for(;i0;i-) +k;,return(k);,31,int f1(register i),int k=0;,for(;i0;i-) +k;,return(k);,int f2(register i),static int k;,for(;i0;i-) +k;,return(k);,32,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!