C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些。我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂。
一般来说static关键字的常见用法有三种:一是用作局部变量的修饰符;二是用作全局变量修饰符;三是用作函数修饰符。在本篇接下来的描述中,我们将详细分析这三种用法。
1、用于局部变量的修饰
当static用于修饰局部变量时,通常是在函数体内,而且只能在该函数内被调用。但是这样定义的变量通常被称为局部静态变量,它的值的不会因为函数调用的结束而被清除,相反当函数再次被调用时,它的值将会是上衣次调用结束后的值。
比如,我们定义如下的两个变量var1和var2:
void function(void)
{
int var1;
static int var2;
}
在上面这个例子中,变量var1是局部变量,变量var2就是静态局部变量。所以在调用函数后,变量var1的值会被清除,而变量var2的值就会被保留。如果我们多次调用函数,变量var1每次都会从新初始化,而变量var2的值则不会。这一特性有什么作用呢?我们可以用其来实现如计数一样的累计操作。
最后我们来总结一下静态局部变量的特性:
有一点需要说明的是,由于静态局部变量在函数调用完毕后,值并不会被销毁,所以拥有静态局部变量的函数是不可重入的。所以静态局部变量的使用还是谨慎一些为好。
2、用于全局变量的修饰
关键字static还可用于修饰全局变量,该变量在某一个模块中变量,但不属于任何一个函数内,这样的变量通常称为静态全局变量。这样一个变量可以被模块内的所有函数访问,但不能被其它模块内的函数访问。
那么定义这样一个静态局部变量的用处是什么呢?我们觉得最明显的优点主要是两点:
最后我们同样是来总结一下静态全局变量的特性,特别需要注意其作用域,可以和静态局部变量作比较:
所以,当我们使用static用来修饰全局变量的时候,它就将全局变量的作用域限定在了声明它的模块之内,但是并不会改变它的存放位置,还是在静态存储区中。
3、用于函数的修饰
关键字static还可以用于修饰一个函数,这样的函数我们称之为静态函数。在一个模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,也就是说,这个函数的使用范围被限制在声明它的模块之内。
定义一个静态函数就是在函数的返回类型前加上static关键字。一般函数的定义和声明默认情况下是extern的,但是静态函数只是在声明它的模块中可见,不能被其它模块调用。定义一个静态函数如下:
static void function(void)
{
//函数体
}
那么定义静态函数有什么好处呢?与静态全局变量一样,我们觉得最明显的优点主要是两点:
4、总结
我们在这里讨论static关键字,其最大的好处是能够实现数据和操作的封装,这种封装实际上就是限定数据和函数的作用范围。可能有人会问限定作用范围有什么用呢?
首先,能够传递给使用者所要的属性和操作信息,约束数据和操作的作用范围。
其次,隐藏某些不必要对外公开的信息,而需要公开的信息公开,使得调用者更明晰其特性,且使调用更为安全。
再者,可以使得模块的封装性更好,结构更加紧凑和优化。
事实上,在面向对象的语言中,封装对象的属性和操作,并注重属性和操作的私有和公共,也是基于这一思想,不过更完备罢了。
欢迎关注:
原文:https://www.cnblogs.com/foxclever/p/9532795.html