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

下载本文档

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

文档简介

第12章C语言中用户标识符的作用域和存储类 第12章C语言中用户标识符的作用域和存储类 局部变量 全局变量和存储分类用户标识符的作用域局部变量 全局变量和存储分类局部变量及其作用域和生存期auto变量 register变量 静态存储类的局部变量全局变量及其作用域和生存期函数的存储分类用extern说明函数用static说明函数 局部变量 全局变量和存储分类 局部变量 全局变量和存储分类 局部变量及其作用域和生存期 例如 floata 就等价于 autofloata auto变量的存储单元被分配在内存的动态存储区 每当进入函数体 或复合语句 时 系统自动为auto变量分配存储单元 退出时自动释放这些存储单元另作他用 auto变量的作用域是从定义的位置起 到函数体 或复合语句 结束为止 局部变量及其作用域和生存期 例如 voidsub floata inti if i 0 intn printf d n n 所有自动局部变量的存储单元都是在进入这些局部变量所在的函数体 或复合语句 时生成 退出其所在的函数体 或复合语句 时消失 这就是自动类局部变量的 生存期 当再次进入函数体 或复合语句 时 系统将为它们另行分配存储单元 因此变量的值不可能被保留 若通过定义语句给自动变量赋初值 赋初值的操作是在程序运行过程中进行的 每进入一次函数体 或复合语句 就赋一次初值 局部变量及其作用域和生存期 局部变量及其作用域和生存期 includeintpower int registerint main ints s power 5 3 printf d n s intpower intx registerintn registerintp for p 1 n n p p x returnp 局部变量及其作用域和生存期 说明 1 CPU中寄存器的数目是有限的 因此只能说明少量的寄存器变量 2 由于register变量的值是放在寄存器内而不是放在内存中 所以register变量没有地址 也就不能对它进行求地址运算 3 register变量的说明应尽量靠近其使用的地方 用完之后尽快释放 以便提高寄存器的利用效率 这可以通过把对register变量的说明和使用放在复合语句中来实现 全局变量及其作用域和生存期 全局变量可使用extern和static两种说明符 全局变量的作用域和生存期 voidfun1 void voidfun2 void intsum 定义全局变量 main sum voidfun1 void sum inttest 定义全局变量 voidfun2 void sum test 1 全局变量是在函数外部任意位置上定义的变量 它的作用域是从变量定义的位置开始 到整个源文件结束止 sum是在整个源程序的开始定义的 它的作用域是整个程序 test是在函数fun2前定义的 它的作用域从定义处开始直到程序结束 全局变量的使用相当于为函数之间的数据传递另外开辟了一条通道 全局变量的生存期是整个程序的运行期间 若全局变量和某个函数中的局部变量同名 则在该函数中 此全局变量被屏蔽 在该函数内 访问的是局部变量 与同名的全局变量不发生任何关系 例如 全局变量的作用域和生存期 includeintsum 定义全局变量 voidfun void main sum 10 printf main 1 d n sum fun printf main 2 d n sum voidfun void intsum 定义同名局部变量 sum 20 printf fun d n 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 includeintx y 定义全局变量 externintx 说明全局变量 voidfun1 voidfun2 voidfun2 printf d n x 输出结果为111 voidfun3 main fun1 voidfun3 fun2 x fun3 printf d n x 输出结果为112 voidfun1 x 111 程序在不同的编译单位内引用了全局变量x 即在文件file2 c中使用了文件file1 c中定义的全局变量 由于在file2 c中 说明语句externintx 放在了文件开始 所以变量x的作用域包含了file2 c整个文件 若将这一说明改放在函数fun2内 变量x的作用域就只从说明的位置起延伸到函数fun2的末尾 也就是说 在函数fun3中将不能引用全局变量x了 静态全局变量 当用static说明符说明全局变量时 此变量可称作 静态 全局变量 静态全局变量只限于本编译单位使用 不能被其他编译单位所引用 例12 4读程序 分析程序的错误 file1 c文件 file2 c文件 include includestaticintn externintn voidfunc voidfunc main printf file2 d n n n 5

温馨提示

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

评论

0/150

提交评论