「C」存储类型

OrzMiku / 2023-08-20 / 原文

变量的性质

  • 存储期 分为自动存储期和静态存储期
  • 作用域 生效的位置,分为块作用域和文件作用域
  • 链接 分为内部链接,外部链接和无链接,内部链接变量只属于一个文件,该文件的函数可以使用.外部链接可以共享给其他文件.无链接的变量属于一个单独的函数且不能共享.

变量默认的性质取决于他被定义的位置.分为两种:

  • 在块(包括函数体内)内声明
    • 自动存储期
    • 块定义域
    • 无链接
  • 在程序的最外层(任意块外部)声明
    • 静态存储期
    • 文件作用域
    • 外部链接

大多数情况下,默认的性质都是满足要求的.当无法满足要求时,可以通过指定明确的储存类型来改变变量的性质.

存储类型

变量的存储类型

auto

  • auto只对块内的变量有效
  • 自动存储期,块定义域,无链接
  • 块内声明的变量默认就是auto

static

static在块内和块外的含义是不同的

块内部

  • 变量为静态变量
  • 静态存储期,块定义域,无链接
    • 块内的static变量只被初始化一次.会被永久保留(即使离开块,第二次进入块时变量仍是上次的变量)
    • 当需要写一个递归函数时,就可以使用static来保存变量值.
    • 函数不能返回一个auto变量,因为离开函数块后这个变量所在的内存无法保证被其他东西写入.但是static变量的内存会被永久保存,因此函数可以返回一个static变量.

块外部

  • 变量为内部链接,只能在该文件中使用.

extern

extern的用途可以看之前的大程序结构.

  • 静态存储期.
  • 作用域取决于声明的位置.
  • 一般具有外部链接.如果在块外部被static声明过,再被extern声明就具有内部链接.

register

register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。

使用register的条件:

  • register的值必须能被cpu接受
  • register变量可能不在内存中,不能用&取地址
  • 只有局部变量和形参可以作为寄存器变量.
  • 局部静态变量不能作为寄存器变量.
  • cpu的进村器数量有限,不能定义过多的寄存器变量.