[zt] 全局变量、静态全局变量、静态局部变量和局部变量,寄存器变量的区别

来源:互联网 发布:5555be%2ecom域名升级 编辑:程序博客网 时间:2024/05/22 01:48

http://hi.baidu.com/bluesealjw/blog/item/c17377233dc315a24623e892.html

 

also:

 

http://topic.csdn.net/t/20050112/17/3720327.html

 

变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量;。

 

 

 

全局变量: 没有定义存储类型的外部变量,系统将默认为是自动型(auto型).

静态型变量是定义为static的变量存放在内存的数据区中,在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的,只有程序结束后,才释放所占用的内存.

 

局部变量:是自动型变量;自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的.

 

寄存器变量:在变量名及类型之前加上关键字register。只能用于整型和字符型变量。它存储在CPU的寄存器中, 数据在寄存器中操作比在内存中快,因此执行速度比自动、静态变量都快。但Turbo C2.0只允许同时定义两个寄存器变量, 一旦超过两个, 编译程序会自动将超过数目的变量当作非寄存器变量处理。另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量, 不能用作全程变量。定义一个整型寄存器变量可写成: register int a;

按存储区域:全局变量、静态全局变量,静态局部变量都存放在内存的全局存储区域;内存分配是静态存储方式(全局数据区分为—全局数据区和静态数据区,全局变量存放在全局数据区;静态数据区专门存放static变量)        局部变量存放在内存的栈区,是动态临时存储。

局部变量是在栈中,外部变量是放在数据段,手动分配malloc的才是放在堆中。

 

按作用域分:全局变量随主程序创建和销毁,在整个工程文件内都有效;(如果源程序是多个文件,必须在其他的文件中再说明为外部变量(extern), 被其它源文件使用。(为了使变量除了在定义它的源文件中使用外, 还被其它文件使用。必须将全程变量通知每一个程序文件, 此时用 extern来说明。)     静态全局变量只在定义它的文件内有效;不能再被说明为外部变量,只能为该源文件内的函数公用。

静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失,保存上次修改后的值;局部变量在定义它的函数内有效,但是函数返回后变量失效。(存储方式和生存周期的区别)

static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

初始化:全局变量和静态变量内存分配是静态的,在main()前由C、C++运行期函数初始化,如果没有初值,会自动初始化为0。局部变量内存分配是动态的,位于线程堆栈中。若没有初始化,初值视当前内存内的值而定。

综上所述:

static全局变量与普通的全局变量有什么区别?static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别?static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别?static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

int a;   /*全局*/
static int b;   /*静态全局*/

int main()
{
}

这段代码如果是写在file.c里面的,那么file2.c就不能调用b;
但是file2.c中可以通过声明外部变量extent a;
从而调用a

原创粉丝点击