C/C++中全局变量和静态变量的区别

时间:2022-10-11 19:42:23


1. 全局变量的作用域是整个项目,它只需要在一个源文件中定义就可以作用于所有的源文件,其它不包括全局变量定义的文件需要用extern关键字再次声明这个全局变量


2. 全局变量、静态全局变量、静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的。


3. 全局变量、静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收空间。


4. 全局变量和静态变量都是保存在静态存储区中,生命期和程序一样,但是不同的是全局变量的作用域是整个项目,而静态全局变量是当前程序文件,静态局部变量则是当前函数体内。

    全局变量和静态全局变量、静态局部变量默认值都是0,也就是在没有初始化变量值的时候默认为0。


5. 静态变量包含静态局部变量和静态全局变量。

    静态局部变量具有局部作用域只对定义自己的函数可见,只被初始化一次,自从初始化一次之后直到程序运行期间一直都在。

    静态全局变量具有全局作用域作用于定义它的程序文件但是不能作用于项目里的其它文件,这一点和全局变量不同。静态全局变量可以被多次初始化。


6. 把局部变量改变为静态变量之后是改变了它的存储方式和生命期。

    把全局变量改变为静态变量之后是改变了它的作用域,限制了使用范围


7. 看以下几个例子

//测试静态局部变量int Fun(void){
//声明一个静态局部变量
static int num = 0;
++num;
return num;
}
for(int i = 0; i < 10; i++){
cout<<Fun()<<" ";
}
/*
输出结果是
1 2 3 4 5 6 7 8 9 10
*/
/*解释如下
1. 静态局部变量只会被初始化一次,因此第一次调用Fun函数的时候num被初始化为0
2. 然后每次调用的时候++num,第一次调用++num为1;第二次++num为2......
3. 静态局部变量的生命期是整个程序因此值可以保存下来*/


//声明一个静态全部变量static int value;//测试静态全局变量void G(void){    value = 0;    ++value;}for(int i = 0; i < 10; i++){    G();    cout<<value<<" ";}/*输出1 1 1 1 1 1 1 1 1 1解释1. 静态全局变量可以被初始化多次,因为每次调用G函数都会对静态全局变量初始化为02. 每次value的值都初始化为0,++value为1,因此输出的值为1*/

//测试静态局部变量int Get(int x){    static int count = x;return count+x;}printf("%d %d\n", Get(4), Get(5));/*输出9 10解释:1.printf是一个函数,根据函数参数入栈的顺序是从右到左,则先调用Get(5)再调用Get(4)2.调用Get(5)的时候,count第一次被初始化为5,则返回10;第二次调用Get(4)的时候count不再被初始化值为5返回9*/