C语言静态局部变量和全局变量有什么区别,不都是在整个程序中都有效吗。希望能举个简单的例子,谢谢啦

6楼说的我理解了

按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
代码如下:
//test.cpp
#include <iostream.h>
extern int a;//变量声明,不是定义
static int b=5;
void func1()
{
cout < <b < <endl < <a < <endl;//结果为5
}

//main.cpp
int a;
int b=10;
void func2()
{
static int i;
i++;
cout < <i < <endl;
}

void func1();

void main()
{
a=20;
func1();
func2();
func2();
}
输出结果为
5
20
1
2
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-09
静态局部变量只能在定义该变量的函数内使用,全局变量可以在任意函数内使用。
第2个回答  2011-09-09
首先要清楚“整个程序”这个概念。
一个程序由多个编译单位组成。每个可进行单独编译的源文件称为“编译单位”。
在同一编译单位内用EXTERN说明符来扩展全局变量的作用域。
当用STATIC说明符说明全局变量时,此变量可称作“静态”全局变量。静态全局变量只限于本编译单位使用,不能被其它编译单位所引用。
第3个回答  2018-02-23
单就你这个问题,回答就一句话,作用域不一样。
简单例子:
静态局部变量:只有定义这个变量的当前cpp能找到他的定义,其他cpp哪怕extern这个变量,包含对头文件,要用,编译都会报错找不到。(至于生命周期,好比a.cpp里main函数,b.cpp里定义一个B类,类里面一个函数里static int i(默认为0),并打印,赋另外一个值2,再打印,a.cpp里调用B类里这个函数两次,第一次打印0,2;第二次打印2,2,就是说明这个变量在程序没关的时候,哪怕出了b.cpp,static int i的静态局部变量的值还在(但是你就是没法直接在a.cpp里extern来用这个i,要想这么干,请用全局变量))
ps:静态局部变量和静态全局变量也差不多这意思,作用域,前者定义他的大括号里可用,后者定义它的cpp文件里随便用。静态就是指作用域只在定义它的范围(局部or全局)
全局变量:同一个程序,其他cpp里面只要extern这个变量,就能找到这个变量,且只要加好锁,这个程序没关掉,这个变量的数值就有确实含义(没被delete)
第4个回答  推荐于2018-02-24
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。   
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。     
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(尤其是短名全局变量的变量名污染很严重),因此仍以采用局部静态变量为宜。
简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能用,但是静态局部变量只能在一个函数里面用。本回答被提问者和网友采纳
相似回答