请问C++语言里静态变量和全局变量有啥区别?谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问C++语言里静态变量和全局变量有啥区别?谢谢相关的知识,希望对你有一定的参考价值。

还见到过静态全局变量什么的,我觉得那就是包含了静态变量和全局变量的各自的特点,我感觉静态和全局是从两个不同的角度看待变量的,但是究竟是什么角度,刚才查的一些都比较零碎,希望能得到条理比较清晰而且比较全面的答案,主要从二者的使用上说有什么区别和联系,不是说在内存的哪个区存着。谢谢,非常感谢!
这怎么还冒出广告来了~P
那篇文章里好像没有全局变量啊
三楼说的意思是静态变量定义的时候就要初始化而且不能改??相当于一个常量??

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函数都会对静态全局变量初始化为0
2. 每次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
*/
参考技术A 全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!
这样说楼主明白了吗?本回答被提问者和网友采纳
参考技术B 建议去看看这篇文章
http://techbbs.zol.com.cn/1/10_2375.html看完就可以明白了
参考技术C 从生存周期上看2者是一致的,都是程序运行就有了,在退出时释放。从作用域上看,静态变量有局部这个类型,它的作用域小。
锐英源教育--A+网校:面向问题的教学专家,锻造实践能力的引导者。
结合工作经验、开源、英语、视频教学、在线教学、阶段式兴趣和实践。
面授小班授课,加强记忆,从头到尾结合实践。
网校是视频教学和在线交流结合的。视频通俗易懂逐渐深入,在线灵活生动结合具体代码,可以结合例子,远程协助进行指导。

c语言中,声明和定义有啥区别

参考技术A C语言里可能经常会说:
声明变量时不会分配内存,定义变量时才会分配内存。
局部变量的声明即是定义:
void fun()
int a = 1; //既是声明,也是定义,初始值为1
int b; //既是声明,也是定义,初始值伪随机。

全局变量只能定义一次,可以声明多次,在全局变量不可见的地方但又想使用就得进行声明。
同一个文件中,比如main.c:
extern int a; //声明,不再分配内存,extern关键字表示此变量已在其它地方定义。
void fun()
printf("%d\n",a); //此处用到了全局变量a,而a是在后面定义,所以需要在前面再声明一次。

int a = 1; //全局变量a定义,为它分配内存
int main()

fun();
return 0;

不同文件中:
fun.h:
void fun(); //函数声明
fun.c:
extern int a; //声明,不再分配内存,extern关键字表示此变量已在其它地方定义。
//函数定义
void fun()
printf("%d\n",a); //此处用到了全局变量a,而a是在另外一个源文件中定义,所以需要在前面再声明一次。

main.c:
#include "fun.h"
int a = 1; //全局变量a定义,为它分配内存
int main()

fun();
return 0;

前面主要是针对变量的声明和定义的说明,当然也提到了函数的声明与定义。
函数和变量一样,使用前一定要先声明或者定义,定义本身也是一次声明。
//此处定义函数,有函数体,当然也是一次声明。
void fun()
printf("hello world\n");

int main()

fun(); //fun函数在前面已经定义,所以可直接调用
return 0;

另一例子:
void fun();//此处须声明一次(没有函数体),main函数才能调用它。
int main()

fun(); //fun函数在后面定义。
return 0;

//此处定义函数,有函数体,当然也是一次声明。
void fun()
printf("hello world\n");

以上是关于请问C++语言里静态变量和全局变量有啥区别?谢谢的主要内容,如果未能解决你的问题,请参考以下文章

全局静态函数加上static和不加上有啥区别呢 尽量详细点 可加分哦

请问C中结构体变量为全局变量或静态变量时才能初始化么?

在C#中静态变量是否全局变量

请问vc中为啥有的函数前缀为下划线,有的函数无下划线?两者有啥区别?

c语言里一般都说引用而不说使用,引用和使用有啥区别呢

C++中的全局变量普通局部变量和静态局部变量的区别