前言

5种存储类别

存储类别说明符

  • auto extern static register
    内容

  • 作用域
  • 链接
  • 存储期

存储类别可以是变量,还可以是函数

说明

作用域(变量的使用范围)

程序中可访问标识符的区域

  • 块作用域
    {}内的
1
2
3
{
int x;
}

没有{}的块
for while if

  • 文件作用域
    声明在块以外的区域
1
2
3
4
(static)int x;
{

}

(又分为外部链接,和内部链接。区分它们看有没有static)

  • 函数作用域
  • 函数原型作用域
    int function(int x, int y);仅在此时有用

链接(访问范围)

  • 外部链接
    可以在不同文件中访问他(但访问时要加上extern)
  • 内部链接
    可以在一个翻译单元内访问

    编译器源代码文件和所有的头文件都看成一个包含信息的单独文件,而这个文件就是翻译单元。
    每个翻译单元均对应一个源代码文件和它所包含的文件。

  • 无链接
    具有块作用域,函数作用域,函数原型作用域的变量都是无链接变量

存储期(使用时间)

  • 静态存储期
    在程序执行期间一直存在
  • 动态存储期
    可以主动控制
  • 自动存储期(局部变量)
    在块中,从进入块而产生,从退出块而结束

示例

  • 文件作用域,外部链接,静态存储期
    file_1.c
1
2
3
4
int x = 1; //声明定义
{

}

file_2.c
extern int x; //引用定义

  • 文件作用域,内部链接,静态存储期
1
2
3
4
static int x;
{

}
  • 块作用域,无链接,静态存储期
1
2
3
{
static int x;
}
  • 块作用域,无链接,自由存储期
1
2
3
{
int x;
}
  • 寄存器变量(与字典变量属性相同)
    {
    register int x; //特点快速
    }
  1. 函数的存储类别也和变量类似
    int function(int); //默认声明为外部函数
    extern int function(int); //引用声明使用外部函数
    static int function(int); //声明为内部函数

补充

  • 自动存储期的变量
    在进入块中分配内存,
    如果不初始化,则是垃圾值

  • 静态存储期的变量
    在开始程序时分配内存,到程序结束,
    如果不初始化,则为0

  • 静态存储期变量只能被常量赋值

error: initializer element is not constant
1
2
3
4
5
6
#include<stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
static int b = a;
}