版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、变量的作用域和生存期: 变量是对程序中数据存储的抽象,它具有以下属性: (1) 变量的数据类型。C语言程序中的变量都是有类型的。数据类型是变量的运算属性的抽象,它决定了该变量的取值范围和可以施加的运算种类。 (2) 变量的作用域。变量的作用域是指一个变量在程序中的使用范围。 (3) 变量的生存期。变量的生存期是指变量生成以及被撤销的时间。 (4) 变量的存储区。变量的存储区是指存储变量的存储器类型以及存储机制。 变量的作用域、生存期、存储区就是这里要讨论的问题。,1.局部变量和全局变量,变量的作用域是从空间的角度来看变量,这个变量在程序中的哪个域内是可以识别 的,也称为可见(或可用)的。大体上
2、可以分成两种:全局可用(全局变量)与局部可用(局部变量) 局部变量是定义在一个程序块内的变量。程序块可能是一个函数体(主函数),也可能是一个循环体或是选择结构中的一个分支语句块,也可以是任何一个用花括号括起来的语句块(复合语句) 全局变量定义在函数之外,不属于任何语句块 一般来说,定义在什么范围的变量,其作用域就在那个范围,并且在定义语句开始到这个域结束的范围(域)内被使用,这个域之外是不可见的。 在C语言中,凡是声明函数内部的变量都是局部变量(包含参数的形参)。,【例4-8】演示局部变量的作用域,Float f1(int a) int b,c; . Char f2(int x,int y)
3、int i,j; . Int main(void) Int m,n; . 说明:主函数中定义的变量m,n只在主函数中有效,主函数也不能使用其它函数中定义的变量;不同函数中可以使用相同名称的变量,他们表达不同的对象,互不干扰。例如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同的单位,互不混淆,但在同一作用域内不可定义同名的变量。,【例4-9】演示全局变量的作用域,Int p=1,q=5; Float f1(int a) int b,c; . Char c1,c2; Char f2(int x,int y) int i,j; . Int main(void
4、) Int m,n; . ,读程序,分析执行结果: int i=10; main() int j=1; j=fun( ); printf(“%d,”,j); j=fun( ); printf(“%d ”,j); fun( ) int k=0; k=k+i; i=i+10; return(k); ,2.动态变量与静态变量,从变量值存在的时间(即生存期)角度来分,变量可以分为静态变量和动态变址。 任何一个在内存中运行的程序,内存区都被分成代码区和数据区两大部分,而数据区又被分为静态存储区和动态存储区两部分。 动态存储区中的变量在程序进入所在的程序块时被创建(分配存储空间),结束时被撤销(释放存储空
5、间),当所在的块结束后,各变量的值不再保留。这种分配和释放是动态的。如在一个程序中两次调用同一个函数,分配给此函数中局部变量的存储空间地址可能是不同的。这些变量必须由程序员显式地进行初始化,否则它们的初始值是不确定的。 静态存储区是在程序编译时分配的存储区,分配在静态存储区的变量在程序开始执行时被创建并自动初始化(数值变量被初始化为0),当程序结束时才被撤销,所以常称静态变量。生存期是从程序开始运行到程序结束。全局变量就是被分配在静态存储区的。,4.5.2 C语言中变量的存储类型,根据变童的作用域将变量分为全局变量和局部变量,根据变量的生存期将变量分为动态变量和静态变量。因此,C语言根据作用域
6、和生存期将变量整合成四种存储类型。 (1)局部自动类型。在函数内部用标识符auto或register 声明。 (2)静态局部类型。在函数内部,使用Static声明。 (3)静态全局类型。在函数外部,使用Static。声明,也称为静态外部变量。 (4)全局类型。不需要标识符声明。在函数外部直接声明即可,通常称为外部变量。,1. auto 存储类型和register 存储类型,auto 声明符的作用就是告诉编译器将变量分配在动态存储区。也就是说,使用auto声明的变量是局部变量。其格式为: auto 数据类型 变量名初值表达式,; 其中,方括号表示可省略,auto是自动变量的存储类别标识符。如果省
7、略auto,系统默认为此变量为auto。 函数的参数也是一种自动变量。register的作用是用来声明寄存器(寄存器就是CPU 自己的“小内存”,它的特点是容量小、速度快)存储自动变量。这类变量具有局部变量的所有特点。当把一个变量指定为寄存器存储类别时,系统就将它存放在CPU的一个寄存器中。通常把使用频率较高的变量(如循环次数较多的循环变量)定义为register类别。 函数的形参也可以使用寄存器变量。一个计算机系统中的寄存器数量是有限的,因此不能定义任意多个寄存器变量,而且对于不同的系统来说,所允许使用的最大寄存器数量也是不同的。在程序中如果遇到指定为register 类型的变量,系统会尽可
8、能地去实现它。但因为条件所限(如寄存器数量有限),系统会自动将它们(即未能实现的部分)处理成自动类型(auto)变量。,2.静态局部类型,定义局部变量时,使用Static修饰,可以在不改变局部变量的可见域的前提下,使变量成为静态的,即当函数撤销后,变量的值还保留。或者说,这些变量的生存期是永久的,只是在变量的作用域外是不可见的。这样,避免了全局变量的值可以被多处修改将引起的副作用,又可以使函数基于前一次调用的值的基础上工作。 【例4-12】静态局部变量。 在该程序中,每次调用fac(i),打印出一个i!,同时保留这个i!的值以便下次再乘(i + 1)。,若源程序是由多个文件组成的,用Stati
9、c声明外部变量,其作用域仅限于所在的文件,而不用static声明的外部变量的作用域为整个程序(组成源程序的多个文件)。 这种外部变量(全局变量)称为静态全局(外部)变量,在程序设计中,常由若干人分别完成各个模块,各人可以独立地在其设计的文件中使用相同的外部变量名而互不相干,只需在每个文件中的外部变量前加上Static即可。这就为程序的模块化、通用性提供了方便。 需要指出的是,对外部变量加上Static声明,并不是说此时变量放在静态存储区,而不加Static的外部变量放在动态存储区。这两种形式的外部变量都是静态存储方式,只是作用范围不同而已,都是在编译时分配内存的。,3.静态全局类型,利用全局变
10、量实现函数之间传递数据: 全局变量从定义点开始对所有的函数有效,因此可以利用它来实现函数间数据传递。 int sum; main( ) int i,j; printf(“请输入i,j:”); scanf(“%d%d”, ,main( ) int k=4,m=1,p; p=func(k,m); printf(“%d,”,p); p=func(k,m); printf(“%dn”,p); func(a,b) int a,b; static int m=0,i=2; i+=m+1; m=i+a+b; return(m);,main( ) int a=2,i; for(i=0;i3;i+) print
11、f(“%d”,func(a); func(int a) int b=0; static c=3; b+;c+; return(a+b+c);,main() int a=3,b=2,c=1; c-=+b; b*=a+c; int b=5,c=12; c/=b*2; a-=c; printf(“%d,%d,%d,”,a,b,c) a+=- -c; printf(“%d,%d,%dn”,a,b,c) ,main( ) int swap( ); extern int a,b; a=3;b=10; swap( ); printf(“a=%d”,b=%dn”,a,b); int a,b; swap( )
12、int temp; temp=a;a=b;b=temp; ,main( ) int s,i,sum( ); for(i=1;i11;i+) s=sum(i); printf(“s=%dn”,s); sum(int z) int x=0; return(x+=z); 将上题函数sum中x变量的存储类型定义为static型,即 static int x=0;程序的执行结果是:,int x=3; main( ) func(x); printf(“x=%dn”,x); func(x) int x; x=8; ,main( ) int x=20; func(x); printf(“x=%dn”,x); func(int x) x=30; ,static int x=5; main( ) auto int x=3; printf(“1.x=%dn”,x); f1(); f2(); printf(“4.x=%d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电影院售票及服务工作手册
- 2026年耳鼻喉科高质量发展规划
- 生物反馈治疗功能性便秘病人的护理
- 肛肠科治疗操作规范增补
- 医学课件肠造瘘术后功能障碍疾病防治指南解读
- 2026年机动三轮车行业发展行业报告
- 《肝硬化诊疗原则》课件
- 汽车维修厂质量检验办法
- 2026年抗肿瘤药物临床应用与管理培训考试测试卷及答案
- 2026年食品行业科技发展报告
- 2026年零碳产业园项目投资计划书
- 2026年高考化学全国I卷真题含解析及答案
- 生物制药与基因编辑技术
- RTK测量教程培训城市管理与执法探索
- 宠物解剖生理讲解
- 中级财务会计试题以及答案
- 水稻全程机械化栽培技术
- T∕CSTM 00162-2020 透射电子显微镜校准方法
- key-hole经皮内镜颈椎间盘摘除术治疗神经根型颈椎病后路2
- 室内装修拆除合同
- 【课件】北师大版九年级下册21二次函数课件(25张)
评论
0/150
提交评论