C语言基础-存储类别

存储类别

在理解存储类别前,先要复习一些概念和术语。

  • 对象:对于储存在内存中的数据,被储存的每个值都占用一定的物理内存。这样的一块内存成为对象(和面向对象的对象概念不同)
  • 存储期:对象在内存中保留了多长的时间。
  • 标识符用于访问对象,可以用作用域链接描述标识符,表明了程序的哪些部分可以使用它。

我们先介绍`作用域、链接和储存期的含义,再介绍具体的存储类别

1.作用域

作用域描述程序中可访问标识符的区域。
一个C变量的作用域可以是:

  • 块作用域:花括号内的代码,if语句或循环所控制的代码
  • 函数作用域:仅用于goto语句的标签。再块中定义但作用域是整个函数
  • 函数原型作用域:从形参定义处到原型声明结束
  • 文件作用域:定义在函数外面,从它的定义到该定义所在的文件的末尾均可见

注意:当一个源代码中包含一个或多个头文件时,会把所有头文件和编译器源代码文件都看成是一个包含信息的单独文件,文件作用域的实际可见范围是整个翻译单元

2.链接

链接指该变量访问范围
C变量有3种链接属性:外部链接,内部链接或无链接
    具有块作用域、函数作用域和函数原型作用域的变量都是无链接变量
    文件作用域的变量可以是外部链接和内部链接,
    内部链接变量比外部链接变量前面多了个static ,内部链接变量只能在翻译单元中使用,外部链接变量可以在多文件程序中使用

3.存储期

作用域和链接描述了标识符的可见性。存储期描述了通过这些标识符访问的对象的生存期。
C对象有4种存储期:

  1. 静态存储期:关键字static,如果对象具有静态储存期,那么它在程序的执行期间一直存在 注意:文件作用域变量都具有静态存储期,但它的static表示的是其链接属性
  2. 线程存储期: _Thread_local
  3. 自动存储期: 通常是块作用域的变量所具有
  4. 动态分配存储期: 从声明处到块末尾而不是块头到末尾

5种存储类别

存储类别 存储期 作用域 链接 声明方式
自动(局部变量) 自动 块内
寄存器 自动 块内,使用关键字register
静态外部链接(全局变量) 静态 文件 外部 所有函数外
静态内部链接(static全局变量) 静态 文件 内部 所有函数外,翻译单元中,使用关键字static
静态无链接(静态局部变量) 静态 块内,使用关键字static
  • 如果内层块种声明的变量和外层块的变量同名时,优先内层块的变量
  • 寄存器变量储存在寄存器中,所以无法获取其地址
  • 局部静态变量在程序的执行时间一直存在但只能在块内部使用,其值有继承性(就像Java里面的成员变量)
  • 要在外部使用全局变量或在块中使用全局变量或static全局变量。也必须先声明,而且声明前面要加关键字extern
  • 局部变量和静态局部变量在本文件中只能在声明后使用

存储类别的初始化

  • 局部变量不会初始化,但其变量值是分配空间范围中的任意值
  • 静态变量如未人为初始化,则自动初始化为0

存储类别说明符

  • auto:声明局部变量,可忽略
  • register:声明寄存器变量
  • static:声明静态类型
  • extern: 声明时调用(全局/static全局) 变量
  • _Thread_local:声明线程存储期,可以和 static或extern一起使用


存储类别与函数

函数也有存储类别。

  • 外部函数

    double a(int i)

  • 静态函数

    static double a(int i)

  • 内联函数

    extern double a(int i)

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 nakano-mahiro
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信