请问C++语言里静态变量和全局变量有什么区别?谢谢
还见到过静态全局变量什么的,我觉得那就是包含了静态变量和全局变量的各自的特点,我感觉静态和全局是从两个不同的角度看待变量的,但是究竟是什么角度,刚才查的一些都比较零碎,希...
还见到过静态全局变量什么的,我觉得那就是包含了静态变量和全局变量的各自的特点,我感觉静态和全局是从两个不同的角度看待变量的,但是究竟是什么角度,刚才查的一些都比较零碎,希望能得到条理比较清晰而且比较全面的答案,主要从二者的使用上说有什么区别和联系,不是说在内存的哪个区存着。谢谢,非常感谢!
这怎么还冒出广告来了~P
那篇文章里好像没有全局变量啊
三楼说的意思是静态变量定义的时候就要初始化而且不能改??相当于一个常量?? 展开
这怎么还冒出广告来了~P
那篇文章里好像没有全局变量啊
三楼说的意思是静态变量定义的时候就要初始化而且不能改??相当于一个常量?? 展开
4个回答
展开全部
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
*/
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
*/
展开全部
全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!
这样说楼主明白了吗?
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!
这样说楼主明白了吗?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议去看看这篇文章
http://techbbs.zol.com.cn/1/10_2375.html看完就可以明白了
http://techbbs.zol.com.cn/1/10_2375.html看完就可以明白了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从生存周期上看2者是一致的,都是程序运行就有了,在退出时释放。从作用域上看,静态变量有局部这个类型,它的作用域小。
锐英源教育--A+网校:面向问题的教学专家,锻造实践能力的引导者。
结合工作经验、开源、英语、视频教学、在线教学、阶段式兴趣和实践。
面授小班授课,加强记忆,从头到尾结合实践。
网校是视频教学和在线交流结合的。视频通俗易懂逐渐深入,在线灵活生动结合具体代码,可以结合例子,远程协助进行指导。
锐英源教育--A+网校:面向问题的教学专家,锻造实践能力的引导者。
结合工作经验、开源、英语、视频教学、在线教学、阶段式兴趣和实践。
面授小班授课,加强记忆,从头到尾结合实践。
网校是视频教学和在线交流结合的。视频通俗易懂逐渐深入,在线灵活生动结合具体代码,可以结合例子,远程协助进行指导。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询