全局变量,静态变量,局部变量

全局变量:变量的存储类型(变量的生存期):是指为变量分配使用内存空间的方式,也称存储方式。

  1. 静态存储:外部变量(所有函数之外的定义的变量为外部变量,属全局变量,使用静态存储方式保存,保存在全局区,即静态区)和静态变量
  2. 动态存储:自动变量(属于局部变量)和寄存器变量(保存在CPU的寄存器,只有局部变量才能定义为寄存器变量,将变量定义为寄存器变量后就不能对期取址,因为寄存器是没有内存地址的)

自动变量(auto)----生存期:定义该变量的函数被调用时才给它分配存储单元,开始它的生存期,函数调用结束,释放存储单元,结束生存期;作用域:定义它的函数或复合语句内。注,系统不会为其进行默认的初使化赋值值。

寄存器变量(register)----寄存器变量是局部变量,使用动态存储方式。

外部变量----也称全局变量。具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件,当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

    一个C程序由main.c和test.c两个文件组成

    

main.c代码如下
int i,j;
int main()
{
...
return 0;
}

test.c代码如下
extern int i,j;
int myfunction (int m,int n)
{
...
return 0;
}

 

静态变量----静态局部变量:在函数内定义,但当函数退出后,静态局部变量始终还存在,其占用的内存单元不会被人释放,只有当程序结束时,才会随全局变量一起释放。生存期:整个源程序(从变量定义开始到程序结束)。作用域:定义该变量的函数内。退出该函数后,尽管该变量还存在,但不能使用它。如果再次调用定义它的函数时,它又可继续使用,而且保存了前次被人调用后留下的值;静态全局变量:只能在其所在文件模块中的函数中使用。其他文件模块中的函数将不能访问。

内存区域的划分:

  1. 栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值,局部变量的值等。随着函数的调用和返回,栈区的数据将动态变化。
  2. 堆区:程序员向系统申请或释放。若程序员在程序结束时还没有释放,则可能由操作系统回收。malloc.
  3. 全局区:用来保存全局变量和静态变量。在进入程序时分配区域,程序结束后由系统释放。
  4. 文字常量区:用于保存常量字符串的内存区域,程序结束后,由系统释放。
  5. 程序代码区:用于保存函数体的二进制代码。

变量分类表

 

 

 

 

在计算机中存储的位置

 

作用域

 

生存期

 

引用情况

本函数内

函数外

 

本函数内

 

函数外

 

本文件内

 

文件外

 

局

部

变

量

自动(局部)变量

 

内存动态存储区

(即栈区)

 

有效

 

无效

 

有效

 

无效

 

无效

 

无效

静态局部变量

 

内存静态存储区

(即数据段)

 

有效

 

无效

 

有效

 

有效

 

无效

 

无效

 

寄存器变量

 

CPU中的寄存器

 

有效

 

无效

 

有效

 

无效

 

无效

 

无效

 

全

局

变

量

 

静态全局(外部)变量

 

内存静态存储区

(即数据段)

 

有效

 

有效

 

有效

 

有效

 

有效

 

无效

 

非静态全局(外部)变量

 

内存静态存储区

(即数据段)

 

有效

 

有效

 

有效

 

有效

 

有效

 

可引用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-02-21 13:14  limo  阅读(428)  评论(0)    收藏  举报