1、全局变量:
存储区在静态存储区。作用域为整个源程序( 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的)。
2、静态全局变量:
存储区也在静态存储区。static限制作用域,作用域为本文件内有效(定义该变量的源文件内), 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用。
3、局部变量:
存储区是栈区,离开函数体就释放内存。局部变量也可以在堆上进行动态的分配,但须记得释放空间。
4、静态局部变量:
存储区变为静态存储区。当一个函数里面有一个static修饰的局部变量的时候,如果反复调用多次,那么下一次函数用的该变量的值不会再被初始化一次了(不执行static修饰的变量初始化语句),而是采用上一次函数执行完之后此变量的值。静态的局部变量如果没有被初始化,会自动被编译器赋值为0。
静态局部变量只对定义它的函数体始终可见,函数体执行完过后虽然还存在,但是无法被其他的使用了。 在该函数的调用过程中,这个变量作为全局变量可以被使用。且不随着函数结束释放掉,整个程序结束的时候才被释放掉,但是不被其他的函数所引用。跟真正的全局变量还是有区别的。真正的全局变量是所有的函数都可以访问到。
正是由于static局部变量的这种特性,使得静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果,这在多线程编程时可能会成为一种隐患。
5、总结:static三个重要作用:
1)隐藏。当我们同时编译多