Static
在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
摘自:http://c.biancheng.net/cpp/html/2863.html
上一节我们讲到,全局变量和函数的作用范围默认是整个程序,也就是所有的源文件。这给我们带来了很大的方便,让我们能够在
A 文件中调用 B 文件中定义的变量和函数,不必把所有的代码都集中到一个文件,有利于模块化的程序设计。
但是有时候这也会带来冲突,例如在 a.c 中定义了一个全局变量 n,在 b.c 中又定义了一次,编译时就会发生重复定义的错误,因为变量只能定义一次。
如果两个文件都是我们自己编写的或者其中一个是,遇到这样的情况还比较好处理,改变变量的名字就可以;但如果两个文件都是其他程序员编写的,或者是第三方的库,修改起来就颇费精力了。所以,实际开发中我们一般将不需要被其他文件调用的全局变量或函数的作用范围限制在当前文件中。
可以通过 static 关键字来限制,请看下面的代码。
a.c 源码:
- #include <stdio.h>
- static int n = 10;
- void print_n_a(){
- printf("n(a.c) = %d\n", n);
- }
- #include <stdio.h>
- static int n = 20;
- void print_n_b(){
- printf("n(b.c) = %d\n", n);
- }
- #include <stdio.h>
- #include <stdlib.h>
- int n = 100;
- int main ()
- {
- print_n_a();
- print_n_b();
- printf("n(main.c) = %d\n", n);
- system("pause");
- return 0;
- }
n(a.c) = 10
n(b.c) = 20
n(main.c) = 100
我们在 a.c、b.c 和 main.c 中都定义了变量 n,a.c 和 b.c 中的变量 n 都只在各自的文件内有效,main.c 中的变量 n 在整个程序内有效。
由此可见,加了 static 的变量或函数的作用范围仅限于当前文件,对其他源文件隐藏,利用这一特性可以在不同的文件中定义同名的变量或函数,而不必担心命名冲突。
static 局部变量
static 声明的变量称为静态变量,不管是全局变量还是局部变量,都存储在静态数据区(全局变量本来就存储在静态数据区,即使不加 static)。静态数据区的数据在程序启动时就会初始化,直到程序运行结束;对于代码块中的静态局部变量,即使代码块执行结束,也不会销毁。
注意:静态数据区的变量只能初始化(定义)一次,以后只能改变它的值,不能再被初始化,即使有这样的语句,也无效。
请看下面的代码:
- #include <stdio.h>
- #include <stdlib.h>
- int main ()
- {
- int result, i;
- for(i = 1; i<=100; i++){
- result = sum(i);
- }
- printf("1+2+3+...+99+100 = %d\n", result);
- system("pause");
- return 0;
- }
- int sum(int n){
- // 也可以不赋初值 0,静态数据区的变量默认初始化为 0
- static int result = 0;
- result += n;
- return result;
- }
1+2+3+...+99+100 = 5050
我们在 sum() 中定义了一个静态局部变量 result,它存储在静态数据区,sum() 函数执行结束也不会销毁,下次调用继续有效。静态数据区的变量只能初始化一次,第一次调用 sum() 时已经对 result 进行了初始化,所以再次调用时就不会初始化了,也就是说 static int result = 0; 语句无效。
静态局部变量虽然存储在静态数据区,但是它的作用域仅限于定义它的代码块,sum() 中的 result 在函数外无效,与 main() 中的 result 不冲突,除了变量名一样,没有任何关系。
总结起来,static 变量的主要作用有两个。
1) 隐藏
程序有多个源文件时,将全局变量或函数的作用范围限制在当前文件,对其他文件隐藏。2) 保持变量内容的持久化
将局部变量存储到静态数据区。静态数据区的内存在程序启动时就已分配好(内存中所有的字节默认值都是0x00),直到程序运行结束。
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。