C语言程序占用的存储空间通常为3部分,分别称为程序区、静态存储区和动态存储区。

静态存储区---全局变量和局部静态变量存放在这里

动态存储区---形参变量,局部动态变量(auto,register),函数调用现场保护和返回地址等


变量的作用域是指该变量有定义的程序部分。从作用域的角度看,C语言中的变量分为局部变量和全局变量。

一、定义

1.局部变量:在函数内部或复合语句内部定义的变量。函数的形参也属于局部变量。局部变量的作用域是定义该变量的函数或复合语句,在其他范围内无效。

2.全局变量:在函数外部定义的变量,可为本文件所有函数共用的变量称作全局变量,也称外部变量。全局变量的作用域是从定义变量的位置开始,到整个文件结束停止,及有extern声明的其它源文件。 若外部变量与局部变量同名,则外部变量被屏蔽

外部变量定义与外部变量声明不同:声明格式:  extern 数据类型 变量名

定义次数只能一次,声明可多次;定义在所有函数之外,声明在函数内或函数外;定义会分配内存,可初始化,而声明不分配内存,不可初始化


二、变量的存储类型:自动变量(auto),外部变量(extern),静态变量(static),寄存器变量(register)

1.自动变量(auto):只要一个变量在函数内部被说明,并且没有给出其存储类型,就认为它是自动存储类型变量。一般定义形式为:

auto 数据类型 变量名

自动变量的作用范围局限于定义它的函数。所以,自动变量是随函数的引用而存在和消失的,从上次调用到下次调用之间不保留值(即释放存储单元),必须在每次进入时要用赋值表达式赋值,否则其值是杂乱无章的。

2.外部变量(extern):任何在函数之外定义的变量都叫做外部变量。一般定义形式为:

 extern 数据类型 变量名

3.静态变量(static):如果希望在函数调用结束后仍然保留函数中定义的局部变量的值,则可以将该局部变量定义为静态变量(或称为局部静态变量)。一般定义形式为:

 static 数据类型 变量名

静态变量分为内部静态变量和外部静态变量:在函数内部说明的静态变量是内部的,在函数之外说明的静态变量是外部的。

4.寄存器变量(register):C语言中的寄存器变量通常在对执行速度要求很高的情况下使用。其思想是告诉编译程序把该变量保存在一个CPU寄存器中。因为数据在寄存器中操作比在内存中操作快,这样就提高了程序代码的执行速度。很显然,寄存器变量应用于那些使用频繁的变量(如循环计数器等)。一般定义形式为:

 register 数据类型 变量名

注:

局部变量默认为auto型

register型变量个数受限,且不能为long, double, float型

局部static变量具有全局寿命和局部可见性

局部static变量具有可继承性

extern不用于变量定义,可扩展外部变量作用域


三、动态变量与静态变量:

1.存储方式

静态存储:程序运行期间分配固定存储空间

动态存储:程序运行期间根据需要动态分配存储空间

2.生存期

静态变量:从程序开始执行到程序结束

动态变量:从包含该变量定义的函数开始执行至函数执行结束