第12章 C语言中用户标识符的作用域和存储类.ppt_第1页
第12章 C语言中用户标识符的作用域和存储类.ppt_第2页
第12章 C语言中用户标识符的作用域和存储类.ppt_第3页
第12章 C语言中用户标识符的作用域和存储类.ppt_第4页
第12章 C语言中用户标识符的作用域和存储类.ppt_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十二章 用户标识符的作用域和存储类,定义: 给变量分配确定的存储单元; 说明: 只是说明变量的性质,而并不分配存储空间,12.1 局部变量、全局变量,每个变量都有自己的作用域。根据定义变量的语句在程序中出现的部位, 可以分为全局变量和局部变量。,局部变量(内部变量) : 在函数内部或复合语句内部定义的变量(还有形参)。,全局变量(外部变量) : 在函数外部定义的变量。,C语言2种存储类别,自动类 (局部变量),静态类 (全局变量、局部变量),与存储类别相关的说明符:auto(自动)、register(寄存器)、 static(静态)、extern(外部) 说明符号可以放在类型名的左边或者是右

2、边,C程序在内存中的存储映象,动态存储区(堆栈),静态存储区,程序代码区,动态存储区用来保存函数调用时的返回地址、自动类别 的局部变量等等,静态存储区用以存放全局变量及静态类别 的局部变量。,存储类别确定了所说明对象在内存中的存储位置,确定了说明对象 的作用域和生存期。,12.2 局部变量及其作用域和生存期,auto 变量,在函数内部定义变量时,没指定存储类或者使用了auto说明符,系统 就认为所定义的变量具有自动类别。,int a; 等价于 auto int a;,auto变量的存储单元分配在内存的动态储存区,每当进入 函数体(或复合语句),系统自动为auto变量分配储存单元;退出 时自动释

3、放这些单元另存它用。,auto类局部变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止。,void sub(float a) int i; if(i0) int n; printf(“%dn”,n); ,if复合语句里定义变量n, n默认为auto类,当if语句执 行结束,则n所占内存自动释 放,也就是n的作用域从到 。,i的作用域从定义位置开始 ,到sub函数结束,register 变量,寄存器变量也是自动类变量。用register说明变量是建议编译程 序将变量的值保留在CPU的寄存器中,把频繁使用的少数变量指定 为register变量,能提高程序的运行速度。,register i

4、nt s;,定义形式:,说明: 因CPU寄存器数量有限,所以register只能说明少数变量。 没有足够的寄存器或则编译系统认为指定的变量不适合放在 寄存器中时,将按auto变量来处理。 register变量没有地址,不能对其求地址运算。 register变量的说明应尽量靠近其使用的地方,用完后尽快 释放,提高寄存器的利用率。(通过把register变量的说明和使用 放在复合语句中来实现),静态局部变量,当在函数体或者复合语句内部用 static说明变量时 ,静态局部变量 的作用域仍与auto、register类的变量一样。,说明: (1) 在程序执行过程中,static修饰的变量在内存的静态

5、存储区中 占据永久性的存储单元,即使退出函数,下次再进入该函数时,由于 并不释放存储单元,所以存储单元的值得以保留,可以继续使用存储单 元中原来的值。静态局部变量的生存期一直延长到程序运行结束。 (2) 静态局部变量的值是在编译时赋予的,在程序执行期间不再 赋予初值。如果static局部变量没有赋初值,则C自动给其赋初值0。,例 题,12.3 全局变量及其作用域和生存期,全局变量只有静态一种类别,全局变量的说明符extern和static,全局变量在函数外部定义,作用域从变量定义的位置开始,到 整个源文件结束为止。,全局变量生存期是整个程序的运行期间,若全局变量和函数中 定义的局部变量同名,则

6、在该函数中,全局变量被屏蔽,只能访问 局部变量,与同名的全局变量不发生任何关系。,例 题,编译单位:每个可进行单独编译的源文件( *.c ),在同一编译单位内用extern说明符来扩展全局变量的作用域,当全局变量定义在后,使用他的函数在前时,要在该函数中 用extern对此全局变量进行说明,告诉编译系统已经在外部定义了 全局变量,不需再为他开辟存储单元,这时其作用域从extern说 明处起,延伸到该函数的末尾,注意全局变量的定义和说明不同: 变量的定义(开辟储存单元)只能出现一次,且定义全局变量 时不能使用extern说明符; 对全局变量的说明,则可以多次出现在需要的地方,必须 用extern

7、说明符。,例 题,在不同的编译单位内用extern说明符来扩展全局变量的作用域,一个C程序由许多个函数组成,这些函数又可分别存放在不同的源文件中, 每个源文件可以单独进行编译,进行语法检查,生成目标文件(*.obj),然后用 连接程序(link)将多个目标文件连接成一个可执行程序(.exe),当在多个.C文件中要使用同一个全局变量,解决变法: 在其中的一个文件中定义全局变量 ,在其他用到这个全局变量的文件中 用extern对其进行说明( 说明这个变量已经在其他便编译单位中定义,通知编 译程序不必再为其开辟储存单元 ),例 题,静态全局变量,用static修饰的全局变量,此变量为静态全局变量,静态全局变量 只限于本编译单位使用,不能被其它编译单位所引用。,例 题,static限制了全局变量作用域的扩展,达到了信息隐蔽的目的。,12.4 函数s的存储分类,在函数返回类型前加上说明符号extern时,称此函数为“外部函数”,extern说明可以省略 ,一般的函数都隐含说明为extern。所以 以前定义的函数都属于外部函数。,外部函数可以被其它编译单位中的函数调用,如果当函数调用 语句和被调函数不在同一编译单位,且函数的返回值为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论