关键字--static

  static可以用于修饰变量以及函数。

  static本意为静态的,但是其修饰变量时,并不是意味着变量的数值不能改变,而是储存位置和数值不会随着程序的运行而改变(与栈中的变量相比),直到被重新赋值。

  

  一、静态变量:

    在《进程内存区域--栈,堆,代码区,全局(静态)区 ,常量区》简单介绍了各个内存区域.

    1.1 静态局部变量    

      储存位置:局部变量储存于栈中,退出函数后变量数据丢失;而静态局部变量储存于全局(静态)区,退出函数以后,数据仍然储存在内存中,下次进入函数还可以取到上次的运行结果。

      作用范围:静态局部变量作用范围与局部变量相同。

      例如:

      void fun()

      {

        int m=10; //m储存于栈中

        static int n=10; //n储存在全局(静态)区,n的内存分配和初始化在编译时完成,gdb单步调试不过执行该语句

        ++m;  //m=11

        ++n;  //n中保留上次数值,每调用一次fun(),n的数值增加1,第一次调用时n=11,第二次调用n=12, ...

      }

 

    1.1 静态全局变量

      储存位置:由于全局变量和静态变量放在一起,都在全局(静态)区,所以静态全局变量与全局变量储存位置一样。

      作用范围:全局变量可以作用于所有文件声明该变量以后直到文件结束;静态全局变量的作用范围仅限于定义该变量的文件。

      所以“extern static int a;”这样的写法是错误的。

 

  二、静态函数

    普通函数定义后只要在其他文件中声明一下,就可以调用;而静态函数只能作用于定义该函数的文件,在其他文件中不能调用。

 

  总结:static关键字对局部变量的影响主要是储存位置的变化(同时可能影响程序结果);对全局变量和函数的影响主要是作用范围的变化(限制于定义所在的文件),这个特性可用于防止函数/变量重名和限制其使用范围。

 

 

posted @ 2013-05-09 18:26  反光镜的博客  阅读(175)  评论(0编辑  收藏  举报