




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C C语言程序设计语言程序设计 第第1212章章 C C语言中用户标识符的作用域和存储类语言中用户标识符的作用域和存储类v变量的属性变量的属性l操作属性操作属性 变量所持有的数据的性质(数据类型)变量所持有的数据的性质(数据类型)l存储属性存储属性u存储器类型:寄存器、静态存储区、动态存储区存储器类型:寄存器、静态存储区、动态存储区u生存期:变量在某一时刻存在生存期:变量在某一时刻存在-静态变量静态变量与与动态变动态变量量u作用域:变量在某区域内有效作用域:变量在某区域内有效-局部变量局部变量与与全局变全局变量量v变量的存储类型变量的存储类型lauto -自动型自动型lregister-寄存器
2、型寄存器型lstatic -静态型静态型lextern -外部型外部型v变量定义格式变量定义格式: 存储类型存储类型 数据类型数据类型 变量表变量表;如: int sum; auto int a,b,c; register int i; static float x,y;v变量的作用域l程序中所声明的变量在程序的那一部分中是可用的。l只有在自己的作用域中才可用。 v内部变量-局部变量l定义:在函数内定义,只在本函数内有效l说明:umain中定义的变量只在main中有效u不同函数中同名变量,占不同内存单元u形参属于局部变量u可定义在复合语句中有效的变量u局部变量可用存储类型:auto regis
3、ter static (默认为auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效从作用域角度考虑分为:内部变量、外部变量v内部变量内部变量(局部变量)(局部变量)的作用域的作用域:是定义它的:是定义它的函数内函数内或或复合语句内复合语句内,在它的作用域,在它的作用域之外之外,内部变量是,内部变量是不可不可见见的,也就是说,一个函数内定义的内部变量是的,也就是说,一个函数内定义的内部变量是不能不能被被其它的函数所引用的。其它的函数所引用的。v特性:有
4、助实现信息特性:有助实现信息隐蔽隐蔽,即使,即使不同的函数不同的函数定义了定义了同同名名的内部变量,也不会相互影响。的内部变量,也不会相互影响。复合语句中变量复合语句中变量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);运行结果:5 4 3 2 1例例 不同函数中同名变量不同函数中同名变量#include main() int a,b; a=3; b=4; printf(main:a=
5、%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4外部变量(全局变量)(全局变量)定义定义:在函数外面定义的变量。外部变量的作用域外部变量的作用域:对于对于只有一个只有一个源程序文件构成源程序文件构成的程序,外部变量的作用域是的程序,外部变量的作用域是从定义它的位置开始从定义它的位置开始,直,直至它所在至它所在源程序文件源程序文件的结束。的结束。特点:特点:外部变
6、量的使用外部变量的使用增加增加了函数之间传递数据的途了函数之间传递数据的途径,在外部变量的作用域内的径,在外部变量的作用域内的任何函数任何函数都能引用该外部都能引用该外部变量变量,一个函数对外部变量的,一个函数对外部变量的修改修改,能影响到其它引用,能影响到其它引用这个变量的函数;因此对外部变量的使用不当,会产生这个变量的函数;因此对外部变量的使用不当,会产生意外的错误意外的错误。float max,min;float average(int n) int i; float x; scanf(“%f”,&x); max=min=x; for(i=2;imax) max=x; else
7、if(xmin) min=x; sum+=x; return(sum/n);main() int n; float ave; scanf(“%d”,&n); ave=average(n); printf(max=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave);作用域maxmin#include int a=3,b=5;max( int a, int b) int c; c=ab?a:b; return(c);main() int a=8; printf(“a=%dn,b=%dn,max=%dn, a,b,max(a,b);外部变量与局部变量同名
8、时,在内部变量的作用域中,外部变量被屏蔽。例: 运行结果:a=8 /*main中的a*/b=5 /*main中的b*/max=8外部变量的作用域可以通过关键字外部变量的作用域可以通过关键字“extern”来扩展:来扩展:int max(int x, int y) int z; z=xy?x:y; return(z);main() extern int a,b;/*当全局变量的定义在后,当全局变量的定义在后,要对引用它的变量要对引用它的变量 用用extern作说明;作说明;*/ printf(max=%d,max(a,b);int a=13,b=-8;运行结果:max=13extern int
9、a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8; 应尽量少使用全局变量,因为:Y全局变量在程序全部执行过程中占用存储单元Y降低了函数的通用性、可靠性,可移植性Y降低程序清晰性,容易出错 定义 说明u次数: 只能1次 可说明多次u位置: 所有函数之外 函数内或函数外u分配内存: 分配内存,可初始化 不分配内存,不可初始化外部变量定义与外部变量说明不同: 在同一个文件中,在同一个文件中,定义定义在在后后使用使用在在前前的的外部变量外部变量,在,在使用前需要对其进行使用前需要对其进行声
10、明声明。 在包含在包含多个文件多个文件的程序中,的程序中,一个文件一个文件若使用若使用其它文件其它文件中中定义的外部变量也要进行声明定义的外部变量也要进行声明。外部变量说明: extern 数据类型 变量表;12.3.2 变量的存储类别-动态变量与静态变量v动态变量:动态变量:动态存储类别的变量当动态存储类别的变量当进入进入定义它的函数或复合语句定义它的函数或复合语句时被时被分配分配存储空间,当存储空间,当离开离开时所占内存时所占内存空间被释放空间被释放。 v 静态变量:静态变量:静态存储类别的变量在静态存储类别的变量在源程序编译的时候源程序编译的时候被分配固定被分配固定的存储空间,从程序开始
11、执行到程序运行结束,一直占用该内存的存储空间,从程序开始执行到程序运行结束,一直占用该内存空间,直至程序运行结束,才被释放空间,直至程序运行结束,才被释放内存空间内存空间。程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用现场保护和返回地址等v生存期-变量存在(在内存有存储空间)的时间段。l静态变量:从程序开始执行到程序结束l动态变量:从包含该变量定义的函数开始执行至函数执行结束12.3.3 内部变量的存储类别 内部变量可以定义为: 自动的(自动的(auto ) 寄存器(寄存器(register ) 静态的静态的(static stati
12、c ) v自动的(自动的(auto ):在函数内定义的变量都是自动的。):在函数内定义的变量都是自动的。 main() int a; /*等价于:等价于:auto int a;*/ v寄存器变量寄存器变量(register ) 如:如:register int i;动态变量静态变量用register说明的变量建议编译程序将变量的值保存在CPU的寄存器中,不占内存单元.目的提高程序的运行速度.说明:少量的寄存器变量. 没有地址概念. 用完之后尽快释放,以提高寄存器的利用率.例 auto 变量的作用域main() int x=1; void prt(void); int x=3; prt(); p
13、rintf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);运行结果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域v静态的静态的(static static ):): 如:如:static int i; 下次再调用该函数时,下次再调用该函数时,staic变量仍使用原来的存储单元,变量仍使用原来的存储单元,仍使用原来存储单元中的值。仍使用原来存储单元中的值。 分配内存后、赋初值,并且只被赋初值分配内存后、赋初值,并且只被赋初值一次一
14、次,未赋值的,未赋值的内部内部staic变量,系统自动给它赋值变量,系统自动给它赋值为为0。被分配在内存的被分配在内存的静态存储区中静态存储区中。 staic变量变量在内存的静态存储区占用的在内存的静态存储区占用的固定固定的内存单元;的内存单元;即使它所在的函数被调用结束后,也即使它所在的函数被调用结束后,也不释放存储单元不释放存储单元,它,它所在单元的值也会所在单元的值也会继续保留继续保留-因此:因此:其它其它函数是不能引用它的。函数是不能引用它的。 #include stdio.hvoid test_a_s()auto int auto_v=0; /*内部自动的内部自动的*/ static
15、 int static_v=0; /*内部静态的内部静态的*/ printf(nauto_v=%d,static_v=%d,auto_v,static_v); auto_v+; static_v+;main()int i; for(i=0;i3;i+) test_a_s();例运行结果: auto_v=0,static_v=0auto_v=0,static_v=1 auto_v=0,static_v=2 利用静态变量的情况:long func(long i) static long k=1; k=k*i;return (k);main()long n,m; printf(n); scanf(%
16、ld,&n); for (m=1L;m=n;m+) printf(n%ld!=%ld, m,func(m);例 5.9计算 1!、2!、3!、n!(n的值由键盘输入) 不利用静态变量的情况:#include long func(long n) long k=1;int i; for(i=1;i=n;i+) k=k*i;return (k);main()long n,m; printf(n); scanf(%ld,&n); for (m=1L;m=n;m+) printf(n%ld!=%ld,m,func(m);变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期
17、编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型变量个数受限,且不能为long, double, float型u局部static变量具有全局寿命和局部可见性u局部static变量具有可继承性uexternextern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别12.4 12.4 内部函数和外部函数内部函数和外部函数12.4.1 外部函数外部函数 外部函数是可以被程序中的外部函
18、数是可以被程序中的其它文件其它文件所调用的函数。所调用的函数。 定义格式如下:定义格式如下: extern 数据类型数据类型 函数名(形式参数表列函数名(形式参数表列) 说明部分;说明部分; 执行部分;执行部分; 外部函数是外部函数是C语言默认的函数语言默认的函数类型,若没有特别的声明类型,若没有特别的声明为为extern类型,系统也会默认为外部函数。类型,系统也会默认为外部函数。12.4.2 内部函数内部函数内部函数内部函数是只能被是只能被本文件中其它函数调用本文件中其它函数调用,而不,而不能被其它文件调用的函数。能被其它文件调用的函数。 它的定义格式如下:它的定义格式如下:static 数据类型数据类型 函数名(形式参数表列)函数名(形式参数表列) 说明部分;说明部分; 执行部分;执行部分; 有以下程序:有以下程序:#include main() int i=1,j=3; printf(“%d,”,i+); int i=0; i+=j*2; printf(“%d,%d,”,i,j);printf(“%d,%dn”,i,j);输出结果:,输出结果:,有以下程序:有以下程序:#include void sub(int *,int *);main() int a=1,2,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课件设计合同协议
- 栏目投资合同协议
- 快递转寄合同协议
- 红酒展会合同协议
- 牛场劳动合同协议
- 抗疫免责合同协议
- 材料力学笔试题及答案
- 临床执业医师考试中知识积累与应试能力的相互促进分析试题及答案
- 2025年公共卫生营养干预试题及答案
- 信息系统项目管理师实务考核内容试题及答案
- 《塑料材质食品相关产品质量安全风险管控清单》
- 问卷调查法完整版本
- 视觉设计基础
- 脚内侧运球变向教案
- 部编版五年级下册语文期中试卷(含答案)
- 中职教育基础模板课件《集合的概念 》
- 人力资源许可证制度(服务流程、服务协议、收费标准、信息发布审查和投诉处理)
- 2024年中考地理二轮复习:地理实践与跨学科主题学习(测试)(原卷版)
- 2024年中国成人心肌炎临床诊断与治疗指南解读课件
- 日本旅游合同范本
- 【矩阵正定的若干判定方法探究4000字(论文)】
评论
0/150
提交评论