静态变量

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 这个说明符在不同的地方所起的作用是不同的。应予以注意

以上是关于静态变量的主要内容,如果未能解决你的问题,请参考以下文章

从外部存储中检索 Relay 查询片段的变量

片段内部静态类和gradle问题

片段 null 必须是公共静态类才能从实例状态正确重新创建

片段中的网格视图

如何创建片段以重复变量编号中的代码行

变量的内存分析图