1. static全局变量与普通的全局变量有什么区别 ?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用;
2. static局部变量和普通局部变量有什么区别 ?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static局部变量只被初始化一次,下一次依据上一次结果值;
3. static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
在使用中上面的意思是很好理解的,可是在具体代码里有时就不好理解了,尤其牵扯到静态局部变量的接口,在代码里很难理解,这里重点说明下
1.在局部变量前加上“static”关键字,就成了静态局部变量。
2.静态局部变量存放在内存的全局数据区,可以当成全局变量来看待。函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。
3.静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则编译器自动为其 初始化为0。
4.静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见,在代码里查看静态局部变量的调用要全局搜索定义它的函数调用,其函数的调用就是静态局部变量的调用,不能简单当成局部变量来看待了,此时它跟函数绑定在一起了,既有局部变量的特征,又包含了全局变量的特征。
5.静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作的运行结果也不同。
例如,下面的程序定义了全局变量、静态局部变量和局部变量:
#include <iostream.h>
int n = 1; //全局变量
void func()
{
static int a = 2; // 静态局部变量
int b = 5; // 局部变量
a += 2;
n += 12;
b += 5;
cout << "a:" << a
<< " b:" << b
<< " n:" << n << endl;
}
void main()
{
static int a; // 静态局部变量
int b = -10; // 局部变量
cout << "a:" << a
<< " b:" << b
<< " n:" << n << endl;
b += 4;
func();
cout << "a:" << a
<< " b:" << b
<< " n:" << n << endl;
n += 10;
func();
}
运行结果为:
a:0 b:-10 n:l
a:4 b:10 n:13
a:0 b:-6 n:13
a:6 b:10 n:35
程序中主函数main()两次调用了func()函数,从运行结果可以看出,程序控制每次进入func()函数时,局部变量b都被初始化。 而静态局部 变量a仅在第一次调用时被初始化,第二次进入该函数时,不再进行初始化,这时它的值是第一次调用后的结果值4。 main()函数中的变量a和b与func()函数中的变量a和b空间位置是不一样的,所以相应的值也不一样。
实际工程代码中,就是使用func()函数里面的静态局部变量a,每调用一次func函数,就会改变一次静态局部变量的值,可以记录事物的状态作进一步处理。
静态局部变量总结:
(1) 静态局部变量在静态存储区内分配存储单元,在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放.
(2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的 值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初 值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。
(5) 静态局部变量的用途有许多:可以使用它确定某函数是否被调用过。使用它保留多次调用的值。
参考文献:
https://blog.csdn.net/wordwarwordwar/article/details/84931984
https://blog.csdn.net/liusicheng2008_liu/article/details/80400396