C语言中数据的两种属性及static的作用

C语言中数据有两种属性:数据类型和存储类别。数据类型定义了数据格式(长度),存储类别定义了数据的作用域和生命期。

1.变量的声明

1.1

变量的声明的一般形式:存储类别 数据类型 变量名;数据类型以int为例:

  • 自动变量:auto int i;//自动变量是局部变量
  • 局部变量:在函数内部定义的变量,局部变量缺省存储类别时就是自动变量
    • 作用域:从定义开始到函数结束。

    • 生命期:从函数调用开始到函数推出为止。

  • 外部变量/全局变量:在函数外部定义而没有指出存储类别的变量
    • 定义外部变量:extern int i = 1;或 int i;

    • 声明外部变量:extern int i;
    • 作用域:从定义开始到到源文件结束。
      • 可用extern声明来扩大外部变量作用域:当一个C程序由多个源文件组成时,外部变量i定义在某个源文件中,其它源文件要使用i需在源文件中声明i,extern int i;。静态全局变量只能在被定义的源文件中使用,不能被其它源文件使用。
    • 生命期:从定义开始到到程序执行结束为止。
    • 用extern声明外部变量来扩大外部变量作用域
  • 静态变量:static int i;寄存器变量:rigister int i;
    • 静态局部变量
      • 作用域:从定义开始到函数结束。
      • 生命期:从定义开始到到程序执行结束为止
    • 静态全局变量
      • 作用域:从定义开始到到源文件结束。即不能通过extern声明被其它源文件使用。
      • 生命期:从定义开始到到程序执行结束为止。
  • 寄存器变量:rigister int i;寄存器变量存储在CPU中。

1.2

  • 静态分配:将数据存在静态存储区,包括静态变量和外部变量,程序执行结束后才释放变量所占用的内存单元。
  • 动态分配:将数据存在动态存储区,包括寄存器变量和局部变量,函数执行结束后就释放变量所占用的内存单元。

2.static的作用

2.1static作用于变量

  • 改变作用域(静态全局变量)
  • 改变生命期(静态局部变量)

2.2static作用于函数

  • 改变函数作用域:被static修饰的函数称为内部函数,只能在其被定义的源文件中使用。没有被static修饰的函数缺省值为extern,为外部函数,可被程序中奇谭源文件使用。

3.C++中的static和unnamed namespace

Unnamed namespace is superior to static keyword, primarily because the keyword static applies only to the variables declarations and functions, not to the user-defined types.

原文地址:https://www.cnblogs.com/bukekangli/p/4320223.html