- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十二章 标识符的作用域和存储类
C语言中,标识符必须先定义后使用,标识符定义的位置决定了标识符的作用域.
在C语言中,由用户命名的标识符都有一个有效的作用域.所谓标识符的作用域就是指程序中的某一部分,在这一部分中,该标识符是有定义的,可以被C编译和连接程序所识别.即标识符的可用范围.
局部变量 全局变量和存储分类
在函数内部或符合语句内部定义的变量,称为局部变量.函数的形参也属于局部变量.也被称为内部变量.
在函数外部定义的变量,称为全局变量.也被称为外部变量.
C语言中,有两种存储类别:一种是自动类,一种是静态类.局部变量既可以说明成自动类,也可以说明成静态类;而全局变量只能是静态类.
有四个与两种存储类别有关的说明符,它们是auto,register, static和extern.这些说明符通常与类型名一起出现,他们可以放在类型名的左边,也可以放在类型名的右边.
存储类别确定了所说明对象在内存中的存储位置,从而也确定了所说明对象的作用域和生存期. P168图12.1
auto变量
在函数内部或复合语句内定义的变量,如果没有指定存储类,或使用了auto说明符,系统就认为所定义的变量具有自动类别.因此
float a; 就等价于 auto float a;
auto变量的存储单元被分配在内存的动态存储区.每当进入函数体(或复合语句)时,系统自动为auto变量分配存储单元;退出时自动释放这些存储单元另作他用.因此,这类局部变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止.
register变量
寄存器变量也是自动类变量,它与auto变量的区别仅在于:用register说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是像一般变量那样,占内存单元.程序运行时,访问存于寄存器内的值要比访问存于内存中的值快得多.因此当程序对运行速度有较高要求时,把那些频繁引用的少数变量指定为register变量,有助于提高程序的运行速度.
register说明只是对编译程序的一种建议,不是强制性的.
不能对register变量求地址
如果CPU中没有足够的寄存器来存放指定的变量,或编译程序认为指定的变量不适合放在寄存器中,将自动按auto变量来处理.
当在函数体(或复合语句)内部用static来说明一个变量时,可以称该变量为静态局部变量.静态局部变量的作用域仍与auto,register类的变量一样,但它与后两者有两点本质上的区别.
1.在真个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元.
2.静态局部变量的初值是在编译时赋予的,不是在程序执行期间赋予.对未赋初值的静态局部变量,C编译程序自动给他赋初值0.
以上两点对于编写那些在函数调用之间必须保留局部变量值的独立函数是非常有用的.
全局变量及其作用域和生存期
全局变量只有静态一种类型.对于全局变量可使用extern和static两种说明符.
全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止.
全局变量的生存期是真个程序的运行期间.
若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内访问的是局部变量,与同名的全局变量不发生任何关系.
1.全局变量在整个程序运行期间都占用内存空间.
2.全局变量必须在函数以外定义,降低了函数的通用性,影响了函数独立性
当全局变量定义在后,引用他的函数在前时,应该在引用他的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已经在外部定义了的全局变量,已经分配了存储单元,不需再为它另外开辟存储单元.这时其作用域从extern说明处起,延伸到该函数末尾.
全局变量的定义只能有一次,全局变量的说明只是变量的声明,并不分配内存空间.可以多次出现在需要的地方.
可在不同的文件内用extern说明符扩展全局变量的作用域
当用static说明符说明全局变量时,此变量可称作静态全局变量.静态全局变量只限于当前编译单位使用,不能被其他编译单位所引用.
函数的存储分类
所有函数都是外部的,因此不允许在函数内部定义另一个函数.当定义函数时,可以使用extern或static说明符.
extern修饰函数,说明函数是外部函数.extern可以省略.
在不同编译单位中的函数调用,一般要在函数调用之前用extern对函数进行说明.
用static修饰函数,使该函数只能在本编译单位内使用.将函数限定为内部函数.
文档评论(0)