资源描述:
《第20讲 局部变量 全局变量和存储分类 局部变量作用域和生存期lgf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第20讲局部变量全局变量和存储分类局部变量及其作用域和生存期第12章用户标识符的作用域和存储类12.1局部变量、全局变量和存储分类1.用户标识符的作用域在C语言中,由用户命名的标识符都有一个有效的作用域。所谓“作用域”是指程序中的某一部分,只有在这一部分中,该标识符才是有定义的,即只有在这个域中才能使用该标识符。例如,在某一函数内定义的变量,只能在该函数内进行使用。显然,变量的作用域与其定义语句在程序中出现的位置有直接的关系。由此可以划分为局部变量和全局变量。局部变量定义:在函数内定义,只在本函数内有效说明:①在main函数中定义
2、的变量只能在main函数中有效②不同函数中的同名变量,占不同的内存单元③函数的形参属于局部变量④可以定义只在某个复合语句中有效的变量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函数中同名变量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d",a,b);sub();printf("main:a=%d,b=%d",a,b);}sub(){int
3、a,b;a=6;b=7;printf("sub:a=%d,b=%d",a,b);}2.局部变量应尽量少使用全局变量,因为:全局变量在程序全部执行过程中始终占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错全局变量说明:extern数据类型变量表;若全局变量与局部变量同名,则全局变量被屏蔽定义:在函数外定义,可为本文件内的所有函数共用有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件3.全局变量全局变量定义全局变量说明次数:只能1次可说明多次位置:所有函数之外函数内或函数外分配内
4、存:分配内存,可初始化不分配内存,不可初始化变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-------静态变量与动态变量作用域:变量在某区域内有效-------局部变量与全局变量指定变量的存储类型时所要用的关键字auto-----自动型register-----寄存器型static------静态型extern-----外部型变量定义格式:[存储类型]数据类型变量表;如:intsum;autointa,b,c;registerinti;stati
5、cfloatx,y;4.变量的存储属性程序区静态存储区动态存储区全局变量、静态局部变量形参变量动态局部变量(auto、register)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间内存用户区5.变量的存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变
6、量全部变量作用域定义变量的函数或复合语句内本文件其它文件局部变量默认为auto型register型变量个数受限,且不能为long,double,float型static局部变量具有全局寿命和局部可见性static局部变量具有可继承性extern不是变量定义,可扩展外部变量作用域registerstatic局部autostatic外部外部存储类别6.变量的存储类型、作用域与生存期12.2局部变量及其作用域和生存期1.auto变量在函数内部(或复合语句内)定义变量时,若使用auto(或缺省),称为“动态局部变量”内。如在一函数中有定义
7、:autointa;或intautoa;或inta;则整型变量a是一个自动类的局部变量。auto变量的特点:1.由于自动类局部变量的存储单元是在进入这些局部变量所在的函数体(或复合语句)时分配,退出所在的函数体(或复合语句)时释放,所以这些变量的生存期是“短期”。2.多次进入同一函数体(或复合语句)时,自动类局部变量所分配的存储位置可能不同。所以,未赋初值的自动变量其值为一个随机值。3.不同函数中使用同名变量不会相互影响。main(){voidf(intx,inty);inta,b;a=10;b=20;f(a,b);if(a
8、{intt;t=a;a=b;b=t;}f(a,b);}auto变量的应用示例(1/8)voidf(intx,inty){intt;t=x+y;printf("x=%d,y=%d,x+y=%d",x,y,t);}内存…….main:a200020