有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。 这时就应该指定该局部变量为静态局部变量(static local variable)。
静态局部变量在静态存储区内分配存储单元。 在程序整个运行期间都
不释放。 而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空
间(而不是静态存储区空间),函数调用结束后即释放。
(2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运
行时它已有初值。 以后每次调用函数时不再重新赋初值而只是保留上次函数调
用结束时的值。 而为自动变量赋初值,不是在编译时进行的,而是在函数调用时
进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动
赋初值 0(对数值型变量)或空字符(对字符型变量)。 而对自动变量来说,如果不赋
初值,则它的值是一个不确定的值。 这是由于每次函数调用结束后存储单元已释
放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用
它的,也就是说,在其他函数中它是“不可见”的。在什么情况下需要用局部静态变量呢?
(1) 需要保留函数上一次调用结束时的值。(2) 如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较
方便,以免每次调用时重新赋值。
. 在一个文件内声明全局变量
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文
件终了。 如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键
字 extern 对该变量作外部变量声明,表示该变量是一个将在下面定义的全局变量
。 有了此声明,就可以从声明处起,合法地引用该全局变量,这种声明称为提前引
用声明。
在多文件的程序中声明外部变量
如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量 num,
不能分别在两个文件中各自定义一个外部变量 num。 正确的做法是:在任一个文
件中定义外部变量 num,而在另一文件中用 extern 对 num 作外部变量声明。
用 static 声明静态外部变量
有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他
文件引用。 这时可以在定义外部变量时加一个 static 声明。
一个变量除了数据类型以外,还有 3 种属性:
(1) 存储类别 C++允许使用 auto,static,register 和 extern 4 种存储类别。
(2) 作用域 指程序中可以引用该变量的区域。
(3) 存储期 指变量在内存的存储期限。