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

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

  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  阅读(374)  评论(0编辑  收藏  举报