|||
在C语言的一个源文件中从变量的作用域的角度来观察,变量可分为全局变量和局部变量(外部变量)
1、局部变量分量种,一种是函数内部定义的变量,它只能在本函数内使用,此函数外不能使用。另一种是在函数的复合语句(如{}包含的程序块)中定义变量,它只能在本复合语句内使用,该复合语句外不能使用。
2、全局变量是在函数之外定义的变量。全局变量可以为本文件中函数所共用(用extern声明后也可被外部)。它的有效范围从定义位置开始到本源文件结束。全局变量在所有函数外定义,在函数内声明,函数内声明可以省略。
内存中供用户使用的存储空间可分为3部分
(1)程序区;
(2)静态存储区,存储全局变量(包括外部变量)和静态局部变量等。静态存储变量默认初值为0。
(3)动态存储区,存储函数形式参数、函数中定义的自动变量和函数调用是的现场保护和返回地址等。动态存储变量初始值不确定。
所以从内存变量值存储方式来观察,变量的存储方式有两种:静态存储方式和动态存储方式。静态存取区还分为栈(由系统分配释放)和堆(由程序员分配释放)除了存储在内存中,有些变量可以存储在CPU的寄存器中。
C语言的存储类别有4种:自动的(auto)、静态的(static)、寄存器的(register)和外部的(extern)。局部变量的存储类别有:
(1)、自动变量即动态局部变量(离开函数,变量消失),存储在内存动态存储区。函数中的函数如果不声明为static都指定为auto即自动变量。自动变量只在函数被调用时存在,离开函数时则消失。下次调用时分配的内存位置可能不同。
(2)、静态局部变量(离开函数,值仍保留),存储在内存静态存储区。函数调用结束时,其占用的存储单元不释放。下次在调用该函数时,该变量以有值。但因为其为局部变量,故不能被其他函数引用。
(3)、寄存器变量(离开函数,值就消失),存储在CPU中的寄存器。
形式参数可以定义为自动变量或寄存器变量。
全局变量都存储在内存静态存储区。因此他们存在于整个程序运行过程。但按可引用范围可分为
(1)静态外部变量(用static声明,只限本文件使用)
(2)外部变量(非静态的外部变量,允许其他文件通过extern引用)。
注意:
(1)在程序中如果局部变量和全局变量同名,全局变量被局部变量屏蔽。
(2)编译器遇到extern时,先在本文件中找外部变量的定义,如果找到就扩展作用域到本文件。如果找不到就在连接时从其他文件中找外部变量的定义,如果找到就扩展作用域到本文件。如果仍未找到,就按出错处理。
(3)多局部变量用static声明,把它分配在静态存储区。对全局变量用static声明,则限制改变量的作用域于本文件。
参考
【1】 谭浩强著. C程序设计(第四版). 北京:清华大学出版社,2010
2014年3月9日
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-20 23:41
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社