静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,可是属于静态存储方式的量不一定就是静态变量,比如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才干成为静态外部变量,或称静态全局变量。对于自己主动变量,它属于动态存储方式。 可是也能够用static定义它为静态自己主动变量,或称静态局部变量,从而成为静态存储方式。

  由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

  1. 静态局部变量

  在局部变量的说明前再加上static说明符就构成静态局部变量。

  比如:

  static int a,b;

  static float array[5]={1,2,3,4,5};

  静态局部变量属于静态存储方式,它具有下面特点:

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

  (2)静态局部变量的生存期虽然为整个源程序,可是其作用域仍与自己主动变量同样,即仅仅能在定义该变量的函数内使用该变量。退出该函数后,虽然该变量还继续存在,但不能使用它。

  (3)同意对构造类静态局部量赋初值。若未赋以初值,则由系统自己主动赋以0值。

  (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自己主动赋予0值。而对自己主动变量不赋初值,则其值是不定的。 依据静态局部变量的特点, 能够看出它是一种生存期为整个源程序的量。尽管离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,并且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑採用静态局部变量。尽管用全局变量也能够达到上述目的,但全局变量有时会造成意外的副作用,因此仍以採用局部静态变量为宜

  2.静态全局变量

  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的差别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件里都是有效的。 而静态全局变量则限制了其作用域, 即仅仅在定义该变量的源文件内有效, 在同一源程序的其他源文件里不能使用它。因为静态全局变量的作用域局限于一个源文件内,仅仅能为该源文件内的函数公用,因此能够避免在其他源文件里引起错误。从以上分析能够看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

  静态变量

  除范围之外,变量还有存活期,在这一期间变量可以保持它们的值。在应用程序的存活期内一直保持模块级变量和公用变量的值。可是,对于 Dim 声明的局部变量以及声明局部变量的过程,仅当过程在运行时这些局部变量才存在。通常,当一个过程运行完成,它的局部变量的值就已经不存在,并且变量所占领的内存也被释放。当下一次运行该过程时,它的全部局部变量将又一次初始化。

  但可将局部变量定义成静态的,从而保留变量的值。在过程内部用 Static keyword声明一个或多个变量,其使用方法和 Dim 语句全然一样:

  Static Depth

  比如,以下的函数将存储在静态变量 Accumulate 中的曾经的运营总值与一个新值相加,以计算运营总值。

  Function RunningTotal (num)

  Static ApplesSold

  ApplesSold = ApplesSold + num

  RunningTotal = ApplesSold

  End Function

  假设用 Dim 而不用 Static 声明 ApplesSold,则曾经的累计值不会通过调用函数保留下来,函数仅仅会简单地返回调用它的那个同样值。

  在模块的声明段声明 ApplesSold,并使它成为模块级变量,由此也会收到相同效果。可是,这样的方法一旦改变变量的范围,过程就不再对变量排他性存取。因为其他过程也能够訪问和改变变量的值,所以运营总值或许不可靠,代码将更难于维护。

  声明全部的局部变量为静态变量

  为了使过程中全部的局部变量为静态变量,可在过程头的起始处加上 Static keyword。比如:

  Static Function RunningTotal (num)

  这就使过程中的全部局部变量都变为静态,不管它们是用 Static、Dim 或 Private 声明的还是隐式声明的。能够将 Static 放在不论什么 Sub 或 Funtion 过程头的前面,包含事件过程和声明为 Private 的过程。