




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用C语言开发简单应用第十三章 变量作用域和生存期上一章内容回顾 函数定义 函数声明和函数原型 函数调用 函数的嵌套调用 函数的递归调用 文件包含 内部函数和外部函数 多文件程序编制 使用函数时应注意的问题2/28本章学习目标 理解变量的作用域 局部变量 全局变量 理解变量的生存期 静态存储方式 动态存储方式 理解变量的存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern) 理解静态局部变量3/28内容进度 变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static)
2、 寄存器(register) 外部的(extern)4/28局部变量 定义: 在函数内或语句块内定义,只在本函数或本语句块内有效。 说明: 不同函数或语句块可以定义同名的局部变量,分配不同的存储单元,互不干扰,不会发生混淆 函数的形参是局部变量,只能在函数内使用5/28局部变量 举例:6/28#include void main() int i=3;int j=5;int k=0; /函数内局部变量 k=i+j; int k=10; /语句块内局部变量 printf(%dn,k); printf(%dn,k);float f1(int a) int b,c; .char f2(int x,in
3、t y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效内容进度 变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern)7/28全局变量 定义: 在所有函数外部定义的变量,有效范围从定义的位置到本文件结束。 举例: 说明: 若全局变量与局部变量同名,则全局变量将被屏蔽。 当一个程序的许多函数都是使用一个全局变量时,全局变量为编程提供了方便。 但是应该避免不必要地使用全局变量,因为: 全局变量在程序的执行期间都占用
4、内存,如果定义很多全局变量,则系统运行中需要消耗较多的内存 会降低函数的通用性、可靠性、可移植性 会降低程序清晰性,容易出错8/28int p=1;float f1(int a) p=10; .char c=A;char f2(int x,int y) c1=B; main() p=20;c=C; .p有效c有效全局变量 应用举例1:9/28#include /*全局变量*/int a=5;int b=10; void fun(void) int c; c=a; a=b; b=c;void main() printf(a=%d,b=%dn,a,b); fun(); printf(a=%d,b=
5、%dn,a,b);全局变量 应用举例2:10/28#include int a=3;int b=5;int max(int a, int b) int c; c=ab?a:b; return(c);void main() int a=8; printf(max=%dn,max(a,b);全局变量 应用举例3:11/28#include int i;void main() void prt();for(i=0;i5;i+)prt();void prt() for(i=0;i5;i+)printf(%c,*);printf(n);内容进度 变量的作用域 局部变量 全局变量 变量的生存期 存储方式
6、静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern)12/28变量的存储方式 静态存储方式: 在程序运行期间分配固定的存储空间的方式。 静态存储区: 全局变量(存储在静态存储区,程序执行时分配存储空间) 静态局部变量(static)(保留上一次调用结束后的变量值) 动态存储方式: 在程序运行期间根据需要动态地分配存储空间的方式。 动态存储区: 函数形参 函数调用时的现场保护和返回地址 非静态局部变量13/28内容进度 变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自
7、动的(auto) 静态的(static) 寄存器(register) 外部的(extern)14/28变量的存储类别 存储类别: 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern) 变量定义: 一般形式:存储类别 数据类型 变量表; 举例: int sum; auto int a; register int i; static float x; extern char ch;15/28auto变量 说明: 动态存储方式,存储在动态存储区 变量定义中存储类别省略时,默认为auto型 auto型变量在函数/语句块被调用时分配内存,每次调用都重新分配,重新
8、赋初值,调用结束则释放空间。 auto型变量如果不赋初值,则其值是一个不确定的值。16/28静态局部变量 举例: 说明: 静态存储方式,在静态存储区分配单元,在程序运行期间都不释放。 静态局部变量具有可继承性,在整个程序运行期间只赋一次初值,以后调用不在重新赋初值,而只是保留上次调用后的值。 在定义时如果没有赋初值,则自动赋初值为该类型的零值。 静态局部变量具有全局的寿命和局部的可见性,作用域仍然是该函数/语句块内。17/28#include void main() void Adda(void);int i=0;for( i=0; i3; i+ )Adda();void Adda(void)
9、 static int x=0; int y=1; int z=0;x+; y+; z=x+y;printf(x=%d,y=%d,z=%dn,x,y,z);静态局部变量 应用举例:输出15的阶乘。18/28#include int fac(int n)static int f=1;f=f*n;return f;void main()int i;for(i=1; i6; i+)printf(%d!=%dn,i,fac(i);register变量 说明: 只有非静态局部变量和形参可定义为register变量,全局变量和静态局部变量不能定义为register变量。 一个系统中的寄存器数目是有限的,不
10、能定义任意多个register变量。 在实践中很少使用register变量,因为目前很多编译器都具有优化选项,会自动把一些频繁使用的变量放在寄存器中以提高效率。19/28用extern声明外部变量 在一个文件内声明外部变量 在多个文件中声明外部变量20/28#include void Demo(void)extern int x,y;int a=10,b=10;x=a-b;y=a+b;printf(DEMO:%d,%dn,x,y);void main()int a=9, b=5;extern int x,y;x=a+b;y=a-b;printf(MAIN:%d,%dn,x,y);Demo();
11、printf(MAIN:%d,%dn,x,y);int x,y;#include extern int x,y;void Demo();void main()int a=9,b=5;x=a+b;y=a-b;printf(MAIN:%d,%dn,x,y);Demo();printf(MAIN:%d,%dn,x,y); main.cint x,y;void Demo()int a=10,b=10;x=a-b;y=a+b;printf(DEMO:%d,%dn,x,y);fun.c用static修饰全局变量 作用: 使全局变量只限于本文件使用,其他文件不能引用,可以防止其他程序无意中错误地引用了全局变
12、量。 举例:21/28extern int a;void main()file1.cstatic int a;void fun(int x)file2.c应用举例22/28#include int i=1;void 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;void main() static int a; register int b=-10; int c=0; printf(
13、-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();应用举例 分析:23/28-Main-i:1 a:0 b:-10 c:0 -Other-i:33 a:4 b:0 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: a2othe
14、r: b0other: c10843315443other: c10675156本章内容总结 对变量的定义,有两种属性:数据类型和存储类别,例如: static int x;(定义静态局部变量或定义限于本文件使用的全局变量) auto int y;(定义自动变量,即局部变量) regiter int a;(定义寄存器变量,函数内部定义) extern int b;(声明已经定义的全局变量)24/28本章内容总结 从作用域角度分为:局部变量和全局变量。 局部变量: 自动变量:存储在动态存储区中,离开函数,值就消失; 静态局部变量:存储在静态存储区中,离开函数,值仍保留; 寄存器变量:存储在寄存器
15、中,离开函数,值就消失; 形参:被看做局部变量,可以定义为自动变量或寄存器变量。 全局变量: 使用extern扩展作用域 使用static限制作用域(静态全局变量:本文件的函数调用,在静态存储区,而且受保护)25/28本章内容总结 从变量的生存期区分:动态存储方式和静态存储方式。 静态存储方式是在程序整个运行期间都存在,而动态存储方式是在调用函数时临时分配单元。 动态存储: 自动变量 寄存器变量 形参 静态存储: 静态局部变量(此函数体内有效,静态存储区.受保护) 全局变量26/28本章内容总结27/28int a;main( ) . . f2; . f1; .f1( ) auto int b; f2; .f2( ) static int c; c作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期: 小结局部变量局部变量全局变量全局变量存储类别存储类别autoregiste
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度浙江省二级造价工程师之建设工程造价管理基础知识综合检测试卷B卷含答案
- 2024年度浙江省二级造价工程师之土建建设工程计量与计价实务考前练习题及答案
- 中学生感恩教育演讲
- 中班健康教案:暖暖的太阳、新鲜的空气
- 中职现代史课件
- 质量管理体系风险管理培训
- 2025年保健食品宣传培训
- 双重预防机制培训
- Unit 2 School things 单元能力达标卷(含答案含听力原文)
- 幼儿园小班社会教案《好妈妈》
- 日间化疗服务管理制度
- 暑假散学典礼课件小学生
- 2024年凉山州木里县选聘社区工作者真题
- 保险公司攒钱活动方案
- 3.5中华人民共和国突发事件应对法
- 2024智联招聘人社局解决就业大型招聘会活动方案
- 2025年新高考1卷(新课标Ⅰ卷)英语试卷
- 部编版七年级语文下册第4单元试题及答案
- GB 18613-2020电动机能效限定值及能效等级
- 《寡人之于国也》课件
- 小儿静脉留置针穿刺技巧与护理培训课件
评论
0/150
提交评论