C语言中有哪些存储类型?

Python014

C语言中有哪些存储类型?,第1张

四种变量存储类型。说明符如下:

auto staticexternregister

一、auto

auto称为自动变量。

局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进

行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上

从来不用。

二、static

static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。

1. 静态局部变量

它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它

函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。

2. 静态全程变量

Turbo C将大型程序分成若干独立模块文件分别编译, 然后将所有模块

的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态

全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与

全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用,

而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。

三、extern

extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要

被其它文件使用。因此, 必须将全程变量通知每一个程序模块文件, 此时可用

extern来说明。

四、register

register称为寄存器变量。

在函数中声明的变量,并不是从程序开始到程序结束始终有效的。变量的生存期也就是生命有两种,它们可以通过 存储期 (storage duration)这个概念来体现。

在函数中不使用存储类说明符 static 而定义出的对象(变量),被赋予了 自动存储期 (automatic storage duration), 它具有以下特性。

也就是说,该对象拥有短暂的寿命,另外, 如果不显式地进行初始化,则该对象会被初始化为不确定的值

被赋予自动存储期的对象,在程序执行到 int ax = 0的时候,就被创建出来并且进行初始化。

在函数中使用 static 定义出来的对象,或者在函数外声明定义出来的对象被赋予了 静态存储期 (static storage duration),它具有以下特性。

也就是说,改对象拥有"永久"的寿命。另外, 如果不显式地进行初始化,则该对象会自动初始化为0 。

被赋予了静态存储期的对象,会在 main 函数开始执行之前被初始化 。因此,虽说程序执行的时候会经过 static int sx = 0的声明,但其实那个时候并没有进行初始化处理,也就是说该声明并未执行赋值处理。

在函数通过存储类说明符 auto 和 register 声明定义出的变量,也被赋予了自动存储期。通过 auto int ax = 0进行的声明和不使用 auto 进行的声明在编译的时候是完全相同的。因此 auto 就显得有些多余了。

另外,使用 register 进行的声明 register int ax = 0,在源程序编译的时候, 变量 ax 不是保存在内存中,而是保存在更高速的寄存器中,然而,由于寄存器的数量有限,所以也不是绝对的

现在编译技术已经十分先进了,那个变量保存在寄存器中更好都是通过编译自行判断并进行最优化处理的(不仅如此,保存在寄存器中的变量在程序执行的时候也可能发生改变)。

使用 register 进行声明也渐渐变得没有意义了。