C语言学习及应用笔记之二:C语言static关键字及其使用

  C语言有不少关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些。咱们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂。安全

  通常来讲static关键字的常见用法有三种:一是用做局部变量的修饰符;二是用做全局变量修饰符;三是用做函数修饰符。在本篇接下来的描述中,咱们将详细分析这三种用法。函数

 1、用于局部变量的修饰优化

  当static用于修饰局部变量时,一般是在函数体内,并且只能在该函数内被调用。可是这样定义的变量一般被称为局部静态变量,它的值的不会由于函数调用的结束而被清除,相反当函数再次被调用时,它的值将会是上衣次调用结束后的值。对象

  好比,咱们定义以下的两个变量var1和var2:内存

void function(void)作用域

{io

    int var1;function

    static int var2;变量

}软件

  在上面这个例子中,变量var1是局部变量,变量var2就是静态局部变量。因此在调用函数后,变量var1的值会被清除,而变量var2的值就会被保留。若是咱们屡次调用函数,变量var1每次都会重新初始化,而变量var2的值则不会。这一特性有什么做用呢?咱们能够用其来实现如计数同样的累计操做。

  最后咱们来总结一下静态局部变量的特性:

  • 存储位置:处于静态存储区,当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改成静态存储区。
  • 初始化操做:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)。
  • 做用域:做用域仍为局部做用域,当定义它的函数或者语句块结束的时候,做用域随之结束。可是静态局部变量在离开做用域以后,并无被销毁,而是仍然驻留在内存当中,直到程序结束,只不过咱们不能再对它进行访问。

  有一点须要说明的是,因为静态局部变量在函数调用完毕后,值并不会被销毁,因此拥有静态局部变量的函数是不可重入的。因此静态局部变量的使用仍是谨慎一些为好。

 2、用于全局变量的修饰

  关键字static还可用于修饰全局变量,该变量在某一个模块中变量,但不属于任何一个函数内,这样的变量一般称为静态全局变量。这样一个变量能够被模块内的全部函数访问,但不能被其它模块内的函数访问。

  那么定义这样一个静态局部变量的用处是什么呢?咱们以为最明显的优势主要是两点:

  • 是一个模块内的变量,避免其它的模块来访问和修改,由于有时候咱们不想它被别人访问。
  • 另外一点,因为有效区域的限制,因此在其它模块中能够使用相同名字的变量,而不会发生冲突,使软件编写更方便。

  最后咱们一样是来总结一下静态全局变量的特性,特别须要注意其做用域,能够和静态局部变量做比较:

  • 存储位置:和静态局部变量同样也处于内存中的静态存储区,而静态存储区在整个程序运行过程当中是一直存在的。
  • 初始化操做:未经初始化的局部静态变量会被程序自动初始化为0,而自动对象的值是任意的,除非他被显示初始化。
  • 做用域:静态全局变量在声明它的模块以外是不可见的,因此他的做用域就在其所属模块,更确切的说是从定义之处开始到模块结尾处。

  因此,当咱们使用static用来修饰全局变量的时候,它就将全局变量的做用域限定在了声明它的模块以内,可是并不会改变它的存放位置,仍是在静态存储区中。

 3、用于函数的修饰

  关键字static还能够用于修饰一个函数,这样的函数咱们称之为静态函数。在一个模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,也就是说,这个函数的使用范围被限制在声明它的模块以内。

   定义一个静态函数就是在函数的返回类型前加上static关键字。通常函数的定义和声明默认状况下是extern的,可是静态函数只是在声明它的模块中可见,不能被其它模块调用。定义一个静态函数以下:

static void function(void)

{

       //函数体

}

  那么定义静态函数有什么好处呢?与静态全局变量同样,咱们以为最明显的优势主要是两点:

  • 一点是,静态函数是一个本地函数,不能够被其它模块的函数调用,方便封装一些模块内部属性的功能。
  • 另外一点,因为有效区域的限制,因此在其它模块中能够使用相同名字的函数,而不会发生冲突,使软件编写更方便。

4、总结

  咱们在这里讨论static关键字,其最大的好处是可以实现数据和操做的封装,这种封装实际上就是限定数据和函数的做用范围。可能有人会问限定做用范围有什么用呢?

  首先,可以传递给使用者所要的属性和操做信息,约束数据和操做的做用范围。

  其次,隐藏某些没必要要对外公开的信息,而须要公开的信息公开,使得调用者更明晰其特性,且使调用更为安全。

  再者,能够使得模块的封装性更好,结构更加紧凑和优化。

  事实上,在面向对象的语言中,封装对象的属性和操做,并注重属性和操做的私有和公共,也是基于这一思想,不过更完备罢了。

欢迎关注:

相关文章
相关标签/搜索