因为在很长一段时间里面一直在写面向对象的东西,比如用C#和Java来写东西,习惯了成员变量和成员函数。对static的了解仅限于他的生命期
在类中,而不是在对象,它为所有的类的对象所共享。但是在C语言里面他究竟有什么意思呢?
第一、静态局部变量(static)
众所周知,局部变量在进入该局部作用域时自动创建,离开时自动销毁,即所谓的块作用域。块作用域可以防止命名冲突,有助于帮助函数独立
化,但是有时候会有特别的需求,比如,统计一个递归函数递归调用了多少次。这个时候局部变量便会在每次进入函数的时候进行创建,根本不
能用作计数器。但是又不想使用全局变量,以免造成名字污染,这时候静态局部变量就派上用场了。静态局部变量的也是块作用域,但是他拥有
永久的存储单元,也就是说他可以再被函数本身访问到,如下代码,可以达到统计递归的次数:
#include <stdio.h> int recu_times(); int main() { printf("%d/n", recu_times()); } int recu_times() { static int cnt = 10; cnt--; if(cnt > 0) recu_times(); return cnt; }
静态局部变量始终有块作用域,所以他对其他的函数是不可见的。静态局部变量是对其他函数隐藏数据的地方,但是它会为将来同一个函数再调用
保留这些数据。
第二、静态全局变量(static)
当使用static声明全局变量的时候,static说明变量具有内部链接。首先需要理解一下,如果全局变量没有声明为static,则在其他文件中可以
通过extern声明来访问此变量,比如我在一个文件中定义了全局变量int i,我就可以在另外一个文件使用extern int i,来声明后就可以在另
外一个文件中访问变量i的值。如果定义了static之后,则无法再访问。
static的这种静态全局变量用来实现一种信息隐藏技术。