1、从作用域角度
在C++中,变量根据定义的位置不同会具有不同的声明周期,具有不同的作用域。
(1)全局变量。具有全局作用域,全局变量只需要在一个源文件中定义,就可以在所有源文件中被使用。在其他源文件中,采用extern关键字(表明当前变量的定义在其他源文件中)就能够再次声明这个全局变量;
(2)局部变量。具有局部作用域,局部变量只在该变量所属函数执行期间存在,当函数调用结束,变量被撤销,其所在的内存空间也将被撤回;
(3)静态全局变量。具有全局作用域。它与全局变量的区别在于,在一个源文件中定义声明的静态全局变量,在其他文件中不能被使用。两个文件尽管定义了相同名字的静态全局变量,但都是不同的变量;
(4)静态局部变量。具有局部作用域。这里的局部作用域体现在该静态局部变量所属函数体。静态局部变量与局部变量不同在于,其在函数体内被定义初始化后,直到程序结束都会一直存在,尽管函数体结束,故多次调用同一函数体,将会操作同一个静态局部变量。但其相当于全局变量而言,仅作用于当前函数体,不能够被其他函数使用。
静态局部变量例子:
int function(void) { static int i = 0; ++i; return i; } int main(void) { for (int j = 0; j < 5; j++) { cout<<function()<<endl; //success,持续输出1-5 } cout<<i<<endl; //error,不能作用于其他函数 return 0; }
2、从分配空间角度
(1)全局变量,静态全局变量,静态局部变量都是在静态存储区分配空间(在整个程序运行期间都存在),而局部变量在栈中分配空间,malloc和new在堆区;
(2)把局部变量改变为静态变量改变了它的存储方式,即将其从栈区改为了静态存储区,声明周期被改变;全局变量改变为静态变量改变了它的作用域,限制了使用范围,在其他源文件中不能被使用。