




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章 C语言中用户标识符的作用域和存储类,第12章 C语言中用户标识符的作用域和存储类,局部变量全局变量和存储分类 用户标识符的作用域 局部变量全局变量和存储分类 局部变量及其作用域和生存期 auto变量、register变量、静态存储类的局部变量 全局变量及其作用域和生存期 函数的存储分类 用extern说明函数 用static说明函数,局部变量全局变量和存储分类,局部变量全局变量和存储分类,局部变量及其作用域和生存期,例如,float a; 就等价于: auto float a; auto变量的存储单元被分配在内存的动态存储区每当进入函数体(或复合语句)时,系统自动为auto变量分配存储单元;退出时自动释放这些存储单元另作他用 auto变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止,局部变量及其作用域和生存期,例如,void sub ( float a ) int i; if ( i 0) int n; printf ( % dn, n ); ,所有自动局部变量的存储单元都是在进入这些局部变量所在的函数体(或复合语句)时生成,退出其所在的函数体(或复合语句)时消失这就是自动类局部变量的“生存期”当再次进入函数体(或复合语句)时,系统将为它们另行分配存储单元,因此变量的值不可能被保留 若通过定义语句给自动变量赋初值,赋初值的操作是在程序运行过程中进行的,每进入一次函数体(或复合语句),就赋一次初值,局部变量及其作用域和生存期,局部变量及其作用域和生存期,#include int power ( int , register int ); main () int s; s=power ( 5,3 ); printf ( % dn, s ); int power ( int x, register int n) register int p; for ( p =1; n; n-) p =p * x; return p; ,局部变量及其作用域和生存期,说明,1) CPU中寄存器的数目是有限的,因此只能说明少量的寄存器变量 2)由于register变量的值是放在寄存器内而不是放在内存中,所以register变量没有地址,也就不能对它进行求地址运算 3) register变量的说明应尽量靠近其使用的地方,用完之后尽快释放,以便提高寄存器的利用效率这可以通过把对register变量的说明和使用放在复合语句中来实现,全局变量及其作用域和生存期,全局变量可使用extern和static两种说明符,全局变量的作用域和生存期,void fun1 ( void); void fun2 ( void ); int sum; /*定义全局变量*/ main () sum+; void fun1 ( void ) sum+; int test; /*定义全局变量*/ void fun2 ( void ) sum+; test =1; ,全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止,sum是在整个源程序的开始定义的,它的作用域是整个程序 test是在函数fun2前定义的,它的作用域从定义处开始直到程序结束。 全局变量的使用相当于为函数之间的数据传递另外开辟了一条通道 全局变量的生存期是整个程序的运行期间 若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系,例如,全局变量的作用域和生存期,#include int sum; /*定义全局变量*/ void fun ( void ); main () sum =10; printf ( * main(1) *: % dn, sum); fun (); printf ( * main(2) *: % dn, sum); void fun ( void ) int sum; /*定义同名局部变量*/ sum =20; printf ( * fun *: %dn, sum); ,全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止,* main(1) *:10 * fun *:20 * main(2) *:10 即全局变量sum的作用域是除函数fun以外的整个程序;局部变量sum的作用域仅是函数fun内部,结果,全局变量的作用域和生存期,全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止,除十分必要外,一般不提倡使用全局变量,原因主要有以下三个方面: 1)不论是否需要,全局变量在整个程序运行期间都占用内存空间 2)全局变量必须在函数以外定义,降低了函数的通用性,影响了函数的独立性 3)使用全局变量容易因疏忽或使用不当而导致全局变量中的值意外改变,从而引起副作用,产生难以查找的错误,说明,在同一编译单位内用extern说明符扩展全局变量的作用域,当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需再为它另外开辟存储单元这时其作用域从extern说明处起,延伸到该函数末尾,全局变量的说明与全局变量的定义不同:变量的定义只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说明,则可以多次出现在需要的地方,这时必须用extern进行说明,注意,在不同编译单位内用extern说明符扩展全局变量的作用域,每个可进行单独编译的源文件称为“编译单位” 当一个程序由多个编译单位组成,并且在每个文件中均需要引用同一个全局变量,这时若在每个文件中都定义了一个所需的同名全局变量,则在“连接”时将会产生“重复定义”错误解决的办法通常是:在其中一个文件中定义所有全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译单位中定义,通知编译程序不必再为它们开辟存储单元,在不同编译单位内用extern说明符扩展全局变量的作用域,/*file1.c文件*/ /*file2.c文件*/ #include #include int x, y; /*定义全局变量*/ extern int x; /*说明全局变量*/ void fun1 (); void fun2 () void fun2 (); printf ( % dn, x); /*输出结果为111 */ void fun3(); main () fun1 (); void fun3 () fun2 (); x +; fun3 (); printf ( % dn, x); /*输出结果为112 */ void fun1 () x =111; ,程序在不同的编译单位内引用了全局变量x,即在文件file2.c中使用了文件file1.c中定义的全局变量由于在file2.c中,说明语句extern int x;放在了文件开始,所以变量x的作用域包含了file2.c整个文件若将这一说明改放在函数fun2内,变量x的作用域就只从说明的位置起延伸到函数fun2的末尾也就是说,在函数fun3中将不能引用全局变量x了,静态全局变量,当用static说明符说明全局变量时,此变量可称作“静态”全局变量静态全局变量只限于本编译单位使用,不能被其他编译单位所引用,例12 .4 读程序,分析程序的错误。,/* file1.c文件*/ /* file2.c文件*/ #include #include static int n; extern int n; void func (); void func () main () printf ( file2:%dn, n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水表检定基础知识培训总结
- 钢结构施工防水与排水方案
- 消防设施消防系统数据同步方案
- 氢能产业园氢能产业市场的供应与需求分析
- 建筑工程项目临时用水与排水系统方案
- 混凝土施工中的原材料质量检测方案
- 施工人员培训方案
- 水电站安全知识培训课件讲座
- 知识点2.2熟悉色彩的体系设计构成设计色彩60课件
- 水电师傅基础知识培训课件
- 驾考题库及答案大全
- 医疗废物与污水处理培训
- 康复科疾病护理
- 4S店员工职业卫生培训
- 地下通道水泵房管理制度
- 溺水患者急救培训
- 2026版步步高大一轮高考数学复习讲义第十章 §10.1 计数原理与排列组合含答案
- 人力公司营销策划方案
- 医院医疗用房管理制度
- 股权代持协议终止协议书
- 国际压力性损伤溃疡预防和治疗临床指南(2025年版)解读
评论
0/150
提交评论