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

来源:互联网 发布:high water mark 算法 编辑:程序博客网 时间:2024/06/10 02:35

一、预备知识-程序内存分配

1、栈区(stack— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,就会造成内存泄露。
3、全局区(静态存储区)(static,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区存放函数体的二进制代码。

数据变量一般都存储在静态存储区和动态存储区(堆,栈)。

二、全局变量

全局变量作用于全局。这个全局是指的所有的源文件,只是其他源文件要用这个变量,需要用关键字extern关键字再次申明这个全局变量。它存储于静态存储区。

file1.cppint a=1,b=2;
┆file2.cppextern int a,b;int main(){   cout<<a<<","<<b<<end!;   return 0;
}
在源文件1中定义了一个全局变量a和b,并且赋了初值。在file2中,用extern关键字申明了a和b,最后输出的值就是1和2.

三、静态全局变量

静态全局变量的作用域就是定义它的文件,其他文件访问不了(即便用上了extern,还是访问不了)。它存储于静态存储区。

四、局部变量

局部变量的作用域是局部的,所在函数调用时分配内存空间,函数结束时释放这些空间。它存储于动态存储区。

五、静态局部变量

静态局部变量作用域还是局部的,但是每次执行完了它的存储单元不释放,在下一次该函数调用时,它还保留上一次函数调用结束时的值。因此如果你希望函数中的局部变量的值在函数调用结束后不消失而保留原值,那就指定为静态局部变量。它和全局变量的区别是全局变量对于所有函数都可见,而静态局部变量只对自己所在的函数可见,且自从第一次初始化后,就一直存在,知道程序结束。

六、对比、区别

1.全局变量,静态全局变量,静态局部变量都在静态存储区分配空间,而局部变量在栈里分配空间

2.静态变量被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量的区别。

3.把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。


0 0