C语言之静态变量

1、静态局部变量

  有时候,我们希望函数中局部变量的值在函数调用结束之后不会消失,而仍然保留其原值。即它所占用的存储单元不释放,在下一次调用该函数时,其局部变量的值仍然存在,也就是上一次函数调用结束时的值。这时候,我们就应该将该局部变量用关键字 static 声明为“静态局部变量”。

  当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。

  对某些必须在调用之间保持局部变量的值的子程序而言,静态局部变量是特别重要的。如果没有静态局部变量,则必须在这类函数中使用全局变量,由此也就打开了引入副作用的大门。使用静态局部变量最好的示例就是实现统计次数的功能,

  

    静态局部变量在函数内定义,但不象普通的自动变量那样,当来调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序

    静态局部变量的生存期虽然为整个源程序,但是其作用域仍与普通的自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

    对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

    根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的百函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(尤其是短名全局变量的变量名污染很严重),因此仍以采用局部静态变量为宜。 

    简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能用,但是静度态局部变量只能在一个函数里面用。

2、静态全局变量

  在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量

  静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。例如,全局变量虽然属于静态存储方式,但并不是静态变量,它必须由 static 加以定义后才能成为静态全局变量

    

3、静态变量和全局变量的区别

  

  变量一般有两个属性,一个是作用域,一个是内存分布空间,静态变量的内存是分配在全局区(静态区)的,全局变量与全局静态变量的区别:

    (1)若程序由一个源文件构成时,全局变量与全局静态变量没有区别

    (2)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享, 即:全局静态变量对组成该程序的其它源文件是无效的。

   静态全局变量的作用:

      (1)不必担心其它源文件使用相同变量名,彼此相互独立。

      (2)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。

4、不同之处:

   按存储区域分:全知局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区。

    按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有道效;静态局部变量只在定义它的函数内有效,只是程序回仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。

    全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知

原文地址:https://www.cnblogs.com/pudonglin/p/12974421.html