C语言编程 第四章 变量存储类型

上传人:沈*** 文档编号:244286961 上传时间:2024-10-03 格式:PPT 页数:23 大小:458.50KB
返回 下载 相关 举报
C语言编程 第四章 变量存储类型_第1页
第1页 / 共23页
C语言编程 第四章 变量存储类型_第2页
第2页 / 共23页
C语言编程 第四章 变量存储类型_第3页
第3页 / 共23页
点击查看更多>>
资源描述
第四章,变量存储类型,目 录,4.1,变量存储类型概述,4.2,自动型变量,auto,4.3,寄存器型变量,register,4.4,静态型变量,static,4.5,外部型变量,extern,4.1,变量存储类型概述,语言变量、函数都有,2,个属性:数据类型和存储类型。,数据类型:用于说明变量,/,函数返回值所占用,(,所分配,),的,内存空间。,存储类型:用于规定变量或函数返回值的作用域和生存,期。,作用域,作用域定义:能访问变量的程序代码范围。,如果一个变量在某源程序文件或某函数范围内有效,则,称该文件或函数为该变量的作用域。,从作用域出发,,C,语言有,2,类变量:,局部变量:仅在函数内部或复合语句内部有效;,全局变量:,从定义处开始到本文件结束皆有效。,4.1,变量存储类型概述,生存期,生存期定义:指变量在内存中存在的时间范围。,从生存期出发,,C,语言有,2,类变量:,静态变量:变量在整个程序的运行时间都存在。,动态变量:变量只在某个函数的执行过程中才存在。,语言的存储类别有四种:,auto,、,static,、,register,和,extern,。,存储空间的划分,程 序 区:用于存放程序编译后形成的可 执行代码(执行时装入),全局数据区:用于存放程序中的全局,/,静态 数据;,堆 区:存放程序的动态数据;,栈 区:存放程序的局部数据。如函数 形参、局部变量、函数调用时 的现场保护和返回地址等。,静态数据,在,全局数据,区中分配存储单元并在程序执行过程 中始终占用该单元,直到程序结束才释放;,动态数据,在函数开始执行时分配动态存储空间,函数结束 时释放这些空间。动态数据保存在,栈区中。,程序区,全局数据区,堆 区,栈 区,程序将操作系统分配给其运行的内存块分成四个区域:,定义:在函数内部定义的变量。,函数中的自动变量,如不做专门的声明,都是动态分配,存储空间,并存储在动态存储区中;用关键字,auto,作存储类,型的声明,这类变量亦称为局部变量。,语法:,auto,数据类型 变量列表;,数据类型 变量列表;,auto int b,c=3;,auto float f;,int b,c=3;,float f;,通常,auto,被省略,不写即隐含确定为“自动存储类”。,自动变量的作用域局限于定义它的程序块,(,函数,/,复合语句,),。其作用域从定义它的地方开始,到同一层的右花括号结束。,4.2,自动型变量,auto,自动型变量只在定义它的函数或复合语句被调用,/,执行时,系统才对其分配内存空间,生存期至此开始。当结束函数调用或执行完复合语句后,系统即回收相应的内存空间。,【,例,】,int f1(int a),int v1,x;,int f2(void),int v2,x,y;,void main(void),int m,y;,a,、,v1,、,x,的有效范围,v2,、,x,、,y,的有效范围,m,、,y,的有效范围,每进入一次函数体或复合语句,赋一次指定的初值。,自动变量不保留上次调用时的运行结果。,【,注,】,主函数,main,中定义的变量只在主函数中有效,其它函数,不能引用;,不同函数中可以使用相同名字的变量,它们代表不同的,对象,占用不同的内存单元,互相独立;,形式参数也是自动变量;,可在复合语句中定义自动变量,其作用域只是本复合语,句。,内层的自动变量,自动暂时“屏蔽”外层的同名变量。,4.2,自动型变量,auto,void main(void),int a,b;,int c;,c=a+b;,变量,a,、,b,在此范围内有效,【,例,】,变量,c,在此范围内有效,此处无法访问变量,c,【,例,4-1】,#include,void main(void),int x=1;,int x=2;,int x=3;,printf(“x=%dn”,x);,printf(“x=%dn”,x);,printf(“x=%dn”,x);,x,x,x,运行结果:,x=3 x=2 x=1,若外层中定义有同名 变量,则内层中出现该变 量名意味着仅可访问内层 变量,同名的外层变量被 压栈。一旦出了内层变量 的作用域,则清除内层变 量,弹出外层变量。该规则对全局变量亦 有效。,语法:,register,数据类型 变量列表;,【,例,】,register int i,j,;,这类变量通常是在强调执行速度的情况下方才使用的。相当于通知系统将一个使用频繁的变量放在一个,CPU,寄存器变量中。,寄存器变量的作用域、生存时间与自动变量相同。,能否将一个说明为寄存器存储类型的变量真正放入一个,CPU,寄存器中要由编译系统根据硬件情况作出相应处理。,TC/BC,只能使用,2,个寄存器变量:,SI,,,DI,,多余的其它寄存器变量自动视作局部变量处理。,寄存器变量的数据类型必须是整型或字符型。,不允许对寄存器变量进行取地址操作。,4.3,寄存器型变量,register,在多次调用同一函数时,有时希望保存自动变量的值,使其不随着函数,/,复合语句的执行结束而消失。既:当再次进入该函数,/,复合语句时,这些自动变量仍保持着原来的值。为此引入静态变量。,所谓“静态”,是指在编译时即为之分配了存储单元,且在程序运行过程中该存储单元不会被撤消。因而是一种“永久性”的存储分配,在整个程序的运行过程中,该变量都是存在的。,格式:,static,数据类型 静态变量列表;,静态变量是性质界于自动变量和全局变量之间的变量。又可分为静态局部和静态全局变量,2,种。,4.4,静态型变量,static,静态局部变量:,在函数或复合语句中定义的静态变量,。,静态局部变量与自动变量有相似之处:其定义总放在函数或程序块的开头;两者作用域相同,都是局限于某一函数或程序块内,即仅在该函数或程序块内方可访问该变量。,两者的区别:自动变量是“,临时性,”的,函数,/,程序块执行时它随之生成,函数,/,程序块执行完后分配给它的存储空间被回收,其值丢失;静态局部变量是“,永久性,”的,当包含它的函数,/,程序块执行完毕,将控制返回给调用函数时,系统分配给该静态变量的存储空间未加回收,它的值被保留下来。当程序再返回来执行同一函数或程序块时,系统取出上次的值作为本次计算的初始值。,函数内部的,static,型数据项在多个函数调用期间将被保存。,4.4,静态型变量,static,4.4,静态型变量,static,静态局部变量的生存期一直延续到程序运行结束。,对未赋初值的静态变量,编译系统为其自动赋,0,初值。,静态局部变量的上述特点,对那些需保留自动变量值的独立函数有用。,【,例,4_2,】,#include,void increment(void);,void main(void),increment();,increment();,increment();,void increment(void),int x=0;,/,局部变量,x+;,printf(x=%dn,x);,【,例,4_3,】,#include,void increment(void);,void main(void),increment();,increment();,increment();,void increment(void),static int x=0;,/,静态局部变量,x+;,printf(x=%dn,x);,运行结果,x=1 x=1 x=1,运行结果,x=1 x=2 x=3,【,例,4_4,】,#include,int f(int n),static int s=1;while(n)s*=n-;return(s);,void main(void),inti,j;i=f(3);,j=f(5);printf(,“,Theoutputis:,”,);,printf(,“,i=%dj=%d,”,i,j);,运行结果,Theoutputis:i=6 j=720,静态全局变量:,在函数之外定义的静态变量,。,静态全局变量是一种作用域受限的全局变量。只在本文件内有效。,对于静态全局变量,其所分配的存储区间的生存期为整个程序的运行期间,即静态全局变量的存储空间一经分配,则直到整个程序运行结束方才回收。,但静态全局变量的作用域为自定义点起至该,C,文件结束。在此区间之外,该静态全局变量虽存在但不可访问。,相对而言,全局变量的作用域:自定义处开始,至整个程序结束止。,4.4,静态型变量,static,与自动(局部)变量相对应,有全局变量:,在函数外部定义的变量。,全局变量可为本文件中所有函数共用,其有效范围为:从定义变量的位置开始到整个程序结束。,4.5,外部型变量,extern,全局变量的作用:增加函数间数据传递的渠道。程序中的所有函数都可以引用全局变量,可以籍此在多个函数间进行直接的数据传递。,使用全局变量亦有副作用:,全局变量使在整个程序运行期间都要占用有关的内存单元,消耗资源;,函数执行过程中依赖特定的全局变量传递参数,降低了函数的通用性;,降低了程序的可读性和清晰性。,#include,int p=1,q=5;,float f1(int a),int b,c;,char c1,c2;,char f2(int x,int y),int i,j;,.,void main(void),int m,n;,全局变量,p,、,q,的作用域,全局变量,c1,、,c2,的作用域,4.5,外部型变量,extern,【,例,】,#include,int k;,void show(void),for(k=1;k=10;k+),putchar(*);,putchar(n);,void main(void),for(k=1;kb?a:b;,return(c);,void main(void),int a=8;,printf(%d,max(a,b);,【,例,】,若全局变量与自动(局部)变量同名,则在局部变量,的作用范围内,全局变量不起作用;,形参,a,、,b,的作用域,全局变量,a,、,b,不起作用,局部变量,a,的作用域,全局变量,b,有效,全局变量,a,、,b,,全局作用域,#include,int max(,int,x,int y),int z;,z=xy?x:y;,return(z);,void main(void),extern int a,b;,printf(%max(%d,%d)=%dn,a,b,max(a,b);,int a=13,b=-8;,【,例,】,若全局变量在文件开头定义,则在整个文件中都可以使用;若未在开头定义,则其作用域只限于说明处到文件结束。如果想在定义之前的函数中引用该全局变量,可在函数中用关键字“,extern,”作“外部变量声明”,在函数内部,,从声明之处起,即可使用它们。,对于多文件系统,全局变量在所有文件的所有函数中有效;在,A,模块中定义的外部变量,若要将其应用于,B,模块中,则须用,extern,定义符进行说明。,int a;,/*,全局变量,*,/,void f(void);,void main(void),f();,extern int a;,void f(void),链 接,A,模块,B,模块,编 译,编 译,A.OBJ,B.OBJ,A.EXE,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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