C语言中变量存储和作用域

来源:互联网 发布:java api安卓版 编辑:程序博客网 时间:2024/06/05 04:03

变量从作用域的角度可以分为局部变量和全局变量,而且有静态存储方式和动态存储方式。

根据存储方式可分为四种:auto, static, register, extern

auto

函数中的局部变量如果不声明为 static 都是动态分配存储空间,数据存储在动态存储区。函数中的形参和函数中定义的变量都是这种,在函数调用期间系统为他们分配空间,函数结束后自动释放存储空间。一般 auto 关键字省略不写。

static

static 声明的局部变量的值在函数调用结束后保留其值,占用的存储单元不会释放,在下次调用函数时可以接着使用其值。

(1)静态局部变量属于静态存储类别,在静态存储区分配空间,在程序整个运行期间都不会释放。

(2)静态局部变量在编译时赋初值,而自动变量在程序运行期间进行赋值。

(3)静态局部变量在函数结束时依然存在,但别的函数不能引用它,他的作用域只限于定义它的函数内。

(4)静态局部变量比较消耗内存,因为不会释放空间,当函数调用多次时,静态局部变量的值比较难确定,容易产生疑惑。

static声明外部变量(全局变量),这时这个全局变量只限于本文件中使用,不能被其他文件引用。(全局变量和静态全局变量都是使用静态存储方式,在编译时分配内存)

register

一般情况下,变量是存放在内存中的,但有时需要频繁使用某个变量,这时可以声明为 register 变量,寄存器变量放在CPU的寄存器中,能快速的读出变量的值,提高程序的执行效率。

(1)只能把局部自动变量或形参声明为寄存器变量。

(2)不能定义过多的寄存器变量,因为计算机中的寄存器是有限的,有的系统会把寄存器变量当做自动变量处理,有的只允许将 int  char 变量定义为寄存器变量。

(3)局部静态变量不能定义为寄存器变量。

extern

extern用来声明外部变量(全局变量),以此来扩展外部变量的作用域。在一个文件中声明外部变量可以在声明之后的任意位置使用该变量,即使该变量定义在文件的后面。而在外面的文件声明外部变量可以使用别的文件中定义的外部变量,只要先声明该变量就行。系统在编译时遇到 extern 时会现在本文件内寻找外部变量的定义,如果找不到会在连接时从其他文件中查找外部变量的定义。如果最终找不到变量的定义就会按出错处理。

变量存储类别函数内作用域函数内存在性函数外作用域函数外存在性自动变量,寄存器变量有有无无静态局部变量有有无有全局变量有有有有静态外部变量有有有(仅限于本文件内)有


0 0
原创粉丝点击