C语言提供了static关键字来修饰变量的定义,static关键字修饰的变量称为:静态变量;该关键字修饰变量的定义格式如下:
static 数据类型名 变量名;
所以,在定义变量的时候,在数据类型名之前添加static关键字,定义的变量就是静态变量。那么,可以包括“静态局部变量”和“静态全局变量”。我们先来总结一下静态局部变量和静态全局变量的特点,然后,再编写测试例子证明。总结如下:
(1) 静态局部变量,其作用域与局部变量一样;就是在定义变量的代码块内;生命期与全局变量一样,是整个程序运行期间。
而且,静态局部变量只初始化一次,初始化第一次之后,第二次再遇到该局部变量的定义时,就不会重新定义。
(2) 静态全局变量,其生命周期与全局变量一样,就是在整个程序的运行期间;作用域则被限制为在定义该静态全局变量的源文件内。例如在test.c源文件中定义了静态全局变量,那么,静态全局变量就只能够在test.c源文件中使用。
(3) 静态局部变量和静态全局变量,它们的初始值都默认设置为0值。
下面我们举例说明静态局部变量的使用,程序测试例子如下:
程序运行结果如下:
可以看到,第一次调用func函数的时候,进入func函数体,定义静态局部变量a,然后,给静态局部变量a赋值,并累加变量的值。使用静态局部变量a的值为15数值。
那么,第二次调用func函数的时候,再次进入func函数,此时,遇到静态局部变量a的定义语句,那么,由于静态局部变量a已经定义过了,所以,不再执行静态局部变量a的定义语句,所以,略过执行静态局部变量a的定义语句。接着对静态局部变量a累加,使变量a的值为25数值。
当第三次调用func函数的时候,与第二次调用func函数一样,由于静态局部变量a已经定义了,所以,不再执行静态局部变量a的定义语句。接着就对静态局部变量a累加,使变量a的值为35数值。
通过这个测试例子,可以看出,静态局部变量的定义语句只执行一次,所以,定义静态局部变量时候的初始化值也只执行一次。
对于静态全局变量,就是其“作用域”只局限于定义该全局静态变量的源文件内,无法通过extern关键字,在其他源文件中使用静态全局变量。首先,我们新建一个test.c源文件,在该源文件中定义一个全局变量:
然后,在新建test1.c源文件,在该文件中,通过关键字引用全局变量。test1.c源文件的代码如下: