作用域 存储期

作用域

  • 块作用域:在块(花括号括起来的复合语句)中局部变量、函数形参、for、while、do…while、if都是块作用域。选择与循环中,整个选择与循环是其所在块的子块,循环体/分支体是整个循环/选择块的子块。若嵌套块作用域出现了同名变量,则最内层的块作用域会覆盖掉外层块作用域的同名变量,直到程序运行退出内部块作用域。

  • 函数作用域:goto语句的标签。一个标签无论在函数体的何处(无论处于多少层块中),其作用域是整个函数

  • 函数原形作用域:函数形参名。范围从形参定义到函数声明结束。也就是说,除了VLA,在函数声明时形参名对于编译器无关紧要。

  • 文件作用域:全局变量。范围:从其被定义到EOF。每组源代码文件及其所包含的文件都是一个翻译单元。具有文件作用域的变量实际可见范围为整个翻译单元。

链接

链接属性:外部链接、内部链接、无链接

  • 块作用域、函数作用域、函数原形作用域都是无链接变量,属于其内部私有

  • 文件作用域:

    1. 外部链接文件作用域变量:在多个翻译单元中能使用的变量,使用存储类别说明符extern。全局作用域一般指代外部链接文件作用域。
    2. 内部链接文件作用域:只能在一个翻译单元内使用的变量,使用存储类别说明符static。

存储期(生存周期)

  • 静态存储期:文件作用域变量
  • 线程存储期:多线程并发程序
  • 自动存储期:默认情况下的块作用域(局部变量)(默认用auto修饰)
  • 动态分配存储期

存储类别

变量存储类别说明符

  • auto(自动)(注:C和C++中的auto不同):在块作用域中未初始化的自动变量会被填充随机值(垃圾数据)。

  • register(寄存器):寄存器变量的register说明符只是一种请求,具体取决于编译器。加上register的变量由于储存在寄存器中,所以没有地址。在C++17中,register已被弃用。

  • extern(外部):变量的定义放在所有函数的外部的变量,所有外部变量均具有静态存储期。

  • static(静态):

    • 局部静态变量:是在块作用域的静态变量,具有块作用域、无链接(这2点和自动变量相同),但具有静态存储期。在函数形参中不能使用static。若未初始化静态变量,会被自动初始化为0。

      在调试过程中会发现,静态变量的定义被跳过。这是因为静态变量和外部变量在程序载入内存时就执行完毕,而并非运行时执行。

    • 外部链接静态变量:具有外部链接的文件作用域、静态存储期,也就是通常说的“全局变量”。在C中,全局变量必须以字面常量进行初始化,以命名常量对全局变量进行初始化在C中是不允许的(C++可以)
      C语言规定编译器至少需要识别局部标识符的前63个字符和外部标识符的前31个字符。

    • 内部链接静态变量:具有内部链接的文件作用域、静态存储期,也就是常说的“用static修饰的全局变量”。

  • _Thread_local(多线程并发程序)

  • typedef(类别重命名)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

函数存储类别说明符

  • extern(外部):默认都为外部函数
  • static(静态/内部)
  • inline(内联)
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值