静态变量
Posted 阿玛尼迪迪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态变量相关的知识,希望对你有一定的参考价值。
变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
对变量存储区域的说明:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
生存期可分为:
1、静态生存期:在程序开始前就已经存在并初始化完成,这个变量要等整个程序结束后才销毁;
2、动态生存期:程序流程运行到这个位置时才会为这个变量分配内存,程序流程离开这个变量的作用域后就销毁它。
可链接性(作用域)可分为:
1、内部链接:这个变量在定义它的文件内有效;
2、外部链接:这个变量在整个工程文件中都有效;
3、不可链接:这个变量只在其代码块中有效;
对变量生存期的说明:全局变量、静态全局变量和静态局部变量都属于静态生存期,即这个变量要等到整个程序结束后才销毁;局部变量属于动态生存期,即该变量在函数中,每一次调用函数,该变量都是全新的一个。
对变量作用域的说明:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,在每次函数调用时分配存储单元,函数返回后,变量消失,存储空间释放。
静态局部变量示例:
1 #include<stdio.h> 2 int fun(int n) 3 { 4 static int f=1; 5 f=f*n; 6 return f; 7 } 8 void main() 9 { 10 int i; 11 for(i=1;i<=5;i++) 12 printf("fun(%d)=%d\\n",i,fun(i)); 13 }
运行结果:
全局变量与静态全局变量的进一步说明:
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
同样的,函数前冠以static就构成了静态函数,表示该函数的作用域仅局限于本源文件,我们称这样的函数为内部函数,使用内部函数的好处是:不同的人编写函数时,不用担心自己定义的函数是否会与其它文件中的函数同名。
从以上分析可以看出, 把局部变量改变为静态局部变量后改变了它的存储方式和生存期,但作用域还是在函数内;把全局变量改变为静态全局变量后改变了它的作用域, 但存储方式和生存期未改变。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
以上是关于静态变量的主要内容,如果未能解决你的问题,请参考以下文章