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的。所以静态局部变量在程序函数借宿的时候不会被撤销,静态局部变量会持续存在并且保持它的值。只有当程序结束的时候,静态局部变量才会被撤销