1) 全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的, 作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。


2)全局 静态变量是显式用static修饰的 全局变量作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。


全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域 这两者在存储方式上并无不同。 这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。





静态局部变量



局部变量前,加上 关键字static,该变量就被定义成为一个 静态局部变量。



通常,在函数体内定义了一个 变量,每当程序运行到该语句时都会给该 局部变量分配栈内存。但随着程序退出 函数体,系统就会收回栈内存, 局部变量也相应失效。



但有时候我们需要在两次调用之间对 变量的值进行保存。通常的想法是定义一个 全局变量来实现。但这样一来, 变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。



静态 局部变量正好可以解决这个问题。静态 局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。



静态 局部变量有以下特点:



该变量在全局数据区分配内存;



静态 局部变量在程序执行到该对象的声明处时被首次初始化,即以后的 函数调用不再进行初始化;



静态 局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;



它始终驻留在全局数据区,直到程序运行结束。但其 作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;



例子程序:



#include<iostream> 
  
 using namespace std; 
  
 size_t count_calls() 
  
 { 
  
static size_t ctr=0; 
  
return ++ctr; 
  
 } 
  
 int main() 
  
 { 
  
for(size_t i=0;i!=10;++i) 
  
cout<<count_calls()<<endl; 
  
return 0; 
  
 }



程序的输出结果是输出1到10的数。因此可以看出每次调用函数,ctr都是在上一次调用后ctr的值得基础上再加1的。所以静态局部变量在程序函数借宿的时候不会被撤销,静态局部变量会持续存在并且保持它的值。只有当程序结束的时候,静态局部变量才会被撤销