C/C++中全局变量和静态变量的区别-阿里云开发者社区

开发者社区> 陈国林> 正文

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

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


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
*/


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C++中L和_T()之区别
字符串前面加L表示该字符串是Unicode字符串。_T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变。因此,Visual C++里边定义字符串的时候,用_T来保证兼容性。
653 0
【转】StringBuilder类与 String类的区别(C#)
StringBuilder类与 String类的区别(C#) 2007-12-03 15:21   在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代码的时候,看到同事也用了StringBuilder类.于是我就上网查查了资料,也想总结下StringBuilder类与 String类的区别.学计算机语言的人一定要明白哦,说不定那天你去找工作了,也会遇到这个问题呢.   String 对象是不可改变的。
738 0
「c/c++专业知识讲解」超详细讲解栈和堆的区别!
「c/c++专业知识讲解」超详细讲解栈和堆的区别!
949 0
C++中指针和引用的区别
指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化后不能被改变,指针可以改变所指的对象。 不存在指向空值的引用,但是存在指向空值的指针。
906 0
c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
好多人喜欢把工具函数做成static member function。这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员。 例如: class my_math { public: static UINT Hash_XYZ(float x,float ...
584 0
C++里大写TRUE和小写true区别
1.C++里有区别true是bool型的;TRUE是int型的,VC里这个是ms自己定义的; C++规定不允许只通过返回类型不同区别两个函数================================================你写错了吧……原函数声明是virtual BOOL Init...
908 0
Google Protocol Buffer使用经验分享(一) C++动态消息与静态消息的博弈
# 写在前面   相信正在浏览这篇文章的同学,一定已经对PB(Protocol buffer)有所了解,所以这里不罗嗦何为PB了。   我自己从去年年底开始对PB的使用逐渐有一些了解,直到在搜索排序框架(iRank)的重构中尝试应用PB,希望能在“数据结构灵活增删改”和“高效的数据传输反序列化”之间求得平衡。   在这过程之中,对PB 动态消息和静态消息的C++使用方式进行了一些调研
5286 0
+关注
陈国林
曾任职于阿里巴巴,现就职于美图,专业搬砖100年~
723
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载