版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十讲 作用范围和存储类别,2,第十讲 作用范围和存储类别,作用范围 存储类别 包含多个源文件的程序,C语言程序设计,3,简介,变量定义的完整格式: 数据类型 占据存储空间的大小 取值范围 存储类别 在内存中持续的时间(生存期) 在硬件中存放的位置 其它属性 作用范围 可以被引用的程序部分(可见性),作用范围和存储类别,4,标识符的作用域,标识符的作用域是指一个标识符,包括变量名、函数名等,在程序中可以被使用的范围。(在这个范围内引用该标识符是合法的,而在这个范围之外,该标识符是不能被引用的) 在C语言中可以在函数内部、函数外部以及函数的参数中定义变量,定义的位置不同,变量的作用域也不同。变量
2、的作用域也称为可见性,变量的声明方式不同,其作用域也不同。 C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。,作用范围和存储类别,5,局部变量,在一个函数内部定义的变量被称作局部变量(形式参数也是局部变量),这种变量的作用域是在本函数范围内,即从变量定义的位置开始,到函数体结束。通俗一点说,局部变量只能在定义它的函数内部使用,而不能在其它函数内使用这个变量。,作用范围和存储类别,6,局部变量,说明: 1、main函数也是一个函数,它内部定义的变量也只能在main函数内部使用,不能在其它函数中使用。同样,主函数中也不能使用其他函数中定义的变量。 2、不同的函数中可以使用同名的变量,
3、这些局部变量代表不同的对象,分配不同的存储单元,不会互相干影响。 3、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。 4、在复合语句内部也可以定义变量,这些变量的作用域只在本复合语句中。,作用范围和存储类别,例,int fun_a(int a) int b,c; . int fun_b(int x) int y,z; main() int m,n; ,a,b,c作用域在fun_a内,同样,x,y,z作用域在fun_b内,m,n作用域在main内,main() int s,a; . int b; s=a+b; . . ,b的作用域在复合语句内,s,a的作用域在main内,8
4、,例,作用范围和存储类别,10-1.c #include fun() int n=6; printf(n in fun:%dn,n); void main() int n=3; fun(); printf(n in main:%dn,n); ,10-2.c #include void main() int i=2,j=3,k; k=i+j; int k=8; if(i=3) printf(%dn,k); printf(%dn%dn,i,k); ,9,全局变量,在函数外定义的变量称为全局变量,也称为外部变量。全局变量的作用域是从定义变量的位置开始到本源文件结束。这样全局变量可以让很多函数都使用它
5、。全局变量一经定义,编译系统会为其分配固定的内存单元,在程序运行时始终都占用固定内存单元。,作用范围和存储类别,10,全局变量,说明: 1、对于局部变量的定义和说明,可以不加区分。而对于全局变量则不然,全局变量的定义和全局变量的说明并不是一回事。全局变量定义必须在所有的函数之外,且只能定义一次。当需要在全局变量定义位置之前引用它,应该使用extern对该变量进行声明,即可在同一文件内部扩展全局变量的作用域。全局变量声明的格式为:extern 类型说明符 变量名; 2、全局变量的初始化只能有一次,是在对全局变量进行定义的时候。 3、全局变量的作用是使得函数间多了一种传递信息的方式。如果在一个程序
6、中各个函数都要对同一个信息进行处理,就可以将这个信息定义成全局变量。另外,采用这种方式,可以从某个函数内部得到多个计算值。(注,使用全局变量会使函数的独立性降低,因此在不必要时尽量不要使用全局变量) 4、在同一个源文件中,如果局部变量和全局变量重名,则在局部变量的作用域内,全局变量不起作用。,作用范围和存储类别,例,int a,b; void fun1() . float x,y; int fun2() . main() .,全局变量a,b作用域,全局变量x,y作用域,10-3.c #include int X=1; printx(); void main() printf(X in main
7、:%dn,X); printx(); printf(X in main:%dn,X); printx() int X=2; printf(X in printx:%dn,X); ,变量的存储类别,求15的阶乘,并将它们依次输出。10-4.c #include void fac(int n) static int f=1; f=f*n; printf(%d!=%dn,n,f); void main() int i; for(i=1;i=5;i+) fac(i); ,为使函数中的局部变量f在函数调用结束后仍能保留,在下一次调用时继续使用,实现方法是将变量f的存储类别定义为静态的。,变量的存储类别,
8、由于程序在执行过程中,程序和数据在内存中存放的区域是有一定规定的。供用户使用的存储空间大致分为三个不同的部分: 1)程序区:存放程序的可执行代码模块。 2)静态存储区:存放所有的全局变量以及标明为静态类的局部变量部分. 3)运行栈区:存放的数据又分为以下几种。 函数调用时,按序动态存放主调函数执行过程中的现场。此类数据存放也称为现场保护。 所有未标明为静态类的局部变量。 函数的形式参数。 存放在运行栈区的数据均采用动态存储分配方法。,变量的存储方式,分为: 静态存储 在变量定义时就分配存储单元并一直保持不变,直至整个程序结束。 动态存储 是在程序执行过程中,使用它时才分配存储单元,使用完毕立即
9、释放。,15,变量的存储类别,四种存储类别说明符 auto register extern static 两种存储时期 动态存储时期 auto register 静态存储时期 extern static,作用范围和存储类别,16,动态存储类别,自动存储 程序执行到变量所在的程序块内时创建它,退出时销毁。 不会被自动初始化。 auto(自动变量):局部变量的缺省类别。 程序块中声明的变量,函数的参数。 register(寄存器变量):建议编译器把变量放进高速的寄存器。 只适用于自动变量。,作用范围和存储类别,auto int a, b;,register int count = 1;,等价于,i
10、nt a,b;,17,静态存储类别,静态存储 程序开始执行时创建,在程序执行期间,变量一直存在。 自动被初始化,缺省初值:0 或 0。 static(静态变量):可以用于在程序块中定义的变量。 退出程序块后依然存在,并保留值。 但不改变其作用范围,即只能在所在的程序块内被使用。 由于所有全局变量都是静态类型的,C语言规定,static通常在全局变量的定义中可以省去不写。 静态变量有两种:静态全局变量和静态局部变量。,作用范围和存储类别,static int a, b;,静态存储类别,extern(外部变量):用来声明在“外部”定义的全局变量。 仅用于声明变量。 只有定义为extern类型的外部
11、变量才能供其他文件使用。外部变量的定义是在所有函数体之外,用extern或默认存储类别说明,定义时可以给它赋初值,而且只能赋初值一次。 外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量是从它的存储方式提出的,表示了它的生存期。,extern int total;,19,案例分析:存储类别,存储类别 读下面的程序,写出结果。(10-5.c),作用范围和存储类别,void try(int a) auto int b=10; static int c=10; b+; c+; printf(a=%dtb=%dtc=%dn, a, b, c); void ma
12、in() int i; for (i=1;i=3;i+) try(i); ,a=1b=11c=11 a=2b=11c=12 a=3b=11c=13,20,案例分析:存储类别,存储类别 结果分析,作用范围和存储类别,c,a,b,a,b,a,b,1,2,3,FF00,2208,2206,2206,2204,2204,2202,a=1b=11c=11 a=2b=11c=12 a=3b=11c=13,21,案例分析:外部变量,外部变量(10-6.c),作用范围和存储类别,#include void main() extern int a; int c=3; printf(a = %dn, a); ex
13、tern int c; c = 4; printf(inner c = %dn, c); printf(c = %dn, c); int a=1; int c=5;,a = 1 inner c = 4 c = 3,22,案例分析:作用范围与存储类别,作用范围与存储类别(cw0903.c),作用范围和存储类别,#include void a(void); void b(void); void c(void); int x = 1; void main() int x = 5; printf(local x in outer scope of main is %dn, x); int x = 7;
14、 printf(local x in inner scope of main is %dn, x); printf(nlocal x in outer scope of main is %dn, x);,23,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,a(); b(); c(); a(); b(); c(); printf(local x in main is %dn, x); void a() int x = 25; /*initialized each time a is called*/ printf(nlocal x in a is %d after ent
15、eringn, x); x+; printf(local x in a is %d before exitingn, x); ,24,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,void b() static int x = 50; printf(nlocal x in b is %d after enteringn, x); x+; printf(local x in b is %d before exitingn, x); void c() printf(nglobal x is %d on entering cn, x); x*=10; printf(globa
16、l x is %d on exiting cn, x); ,25,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,local x in outer scope of main is 5 local x in inner scope of main is 7 local x in outer scope of main is 5 local x in a is 25 after entering a local x in a is 26 before exiting a local x in b is 50 after entering b local x in b is
17、51 before exiting b global x is 1 on entering c global x is 10 on exiting c,26,案例分析:作用范围与存储类别,作用范围与存储类别,作用范围和存储类别,local x in a is 25 after entering a local x in a is 26 before exiting a local x in b is 51 after entering b local x in b is 52 before exiting b global x is 10 on entering c global x is 1
18、00 on exiting c local x in main is 5,27,包含多个源文件的程序,包含多个源文件的程序 每个函数的定义必须在一个文件内,不能被分割。 全局变量可以被同一文件内的函数访问。 如果需要被其他文件内的函数访问,则必须在其他文件内声明。 extern 表示变量myGlobal是在另一个文件内定义的。 一个文件内定义的函数,也可以被其他文件内的函数调用。 在每个文件内加入该函数的原型(声明为外部函数)。 函数的原型可以不需要 extern。,作用范围和存储类别,int myGlobal;,extern int myGlobal;,a.c,b.c,28,包含多个源文件的程序,包含多个源文件的程序 举例,作用范围和存储类别,int a, b; extern int max(void); void main() scanf(%d%d, ,extern int a, b; int max() return (ab?a:b); ,A,B,10-8.c,10-9.c,29,包含多个源文件的程序,包含多个源文件的程序 static 限制全局变量只能被同一文件内的函数访问。 限制函数只能被同一文件内的函数调用。,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026山东青岛海发国际贸易有限公司招聘10人备考题库及答案详解【各地真题】
- 2026云南银卫达保安服务有限公司招聘法律顾问兼董事会秘书1人备考题库含完整答案详解【网校专用】
- 2026年3月广西玉林市陆川县城镇公益性岗位人员招聘5人备考题库含答案详解【达标题】
- 2026春季深圳供电局有限公司校园招聘备考题库附参考答案详解(轻巧夺冠)
- 2025-2030中国智慧城市公共服务行业市场供需分析及投资评估规划分析研究报告
- 2025-2030中国智慧农业行业市场发展趋势调研及精准种植与投资风险评估报告
- 2025-2030中国智慧农业传感器网络覆盖率与应用效果评估报告
- 2026山东青岛澳西智能科技有限公司招聘2人备考题库含答案详解【巩固】
- 2026江苏宿迁市卫生健康委员会所属事业单位招聘11人备考题库及参考答案详解ab卷
- 2026安徽马鞍山和县科技职业学校校园招聘2人备考题库(巩固)附答案详解
- 电气设备安装及调试合同协议书范本6篇
- 北京车牌结婚过户协议书
- 数字音频原理及应用 第4版 习题答案
- 矿业项目进退场交接措施
- 项目施工奖惩管理办法
- 【城市轨道交通客运组织优化研究-以天津地铁为例11000字(论文)】
- 喝酒划拳活动方案
- T/CHES 59-2021组合式金属防洪挡板安装、验收及维护规范
- 建筑行业安全生产部岗位职责
- 宁夏砖瓦用粘土矿产地质勘查技术规程 DB64-T 1754-2020
- 校长在人工智能教师培训专题研讨会上讲话:主动拥抱人工智能才能为学生开辟更广阔的成长空间
评论
0/150
提交评论