静态变量与静态函数
一、 静态变量
1. 静态关键字
静态类型关键字是static
形式:static type X = 0;
C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,外部变量或函数都只能在某个文件中定义一次,而其它文件要访问需要用extern(全局的)声明,当然定义外部变量或函数的源文件中也可以用extern声明该外部变量。
static(静态的)可以限定变量或函数为静态存储,全局变量本身就是静态存储方式,这两者在存储方式上并无不同,只是作用域和生命周期不一样。
2. 几中变量的异同
变量名 | 作用域 | 生命周期 | 无显示初始化默认初始值 |
---|---|---|---|
动态全局变量 | 整个程序 | 程序开始至结束 | 0 |
静态全局变量 | 整个源文件 | 源程序开始至结束 | 0 |
动态局部变量 | 定义的函数体内{} | 函数开始至函数结束 | 随机值 |
静态局部变量 | 定义的函数体内{} | 程序开始至结束 | 0 |
3. 注意⚠️:
- 全局变量和静态全局变量都是静态储存,在储存上没有区别。
- 全局变量可以作用多个源程序,当源程序由多个源文件组成时,全局变量在多个源文件中都有效。
- 静态全局变量只在定义了该变量的源文件中有效,其他源文件不能使用。
- 静态局部变量当出了某个函数时,变量的值还存在,当函数下一次再调用时,静态变量不会再次初始化,而是沿用上次函数退出的值。
- static修饰栈变量,栈变量已经不再存储在栈中,而是和全局变量一起存储。栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。加入static修饰之后,栈变量的生命周期延长到程序执行结束时。
4. 例子
-
累加的算法(使用static定义)
int Add(int x) { static int sum = 1; sum += x; return sum; } int main() { for (int i = 0; i < 5; i++) { printf("%d\n", Add(i)); } system("pause"); return 0; }
输出结果: 1 2 4 7 11
-
如果去掉static
int Add(int x) { int sum = 1; sum += x; return sum; } int main() { for (int i = 0; i < 5; i++) { printf("%d\n", Add(i)); } system("pause"); return 0; }
输出结果: 1 2 3 4 5
二、静态函数
形式:static type fun(); 静态函数
形式:extern type fun1(); 普通函数
通常情况下,(返回值类型)类型前面不写关键字默认为extern。
静态函数的特点:
- 其他文件中可以定义相同的名字的函数。
- 静态函数被自动分配在一个一直使用的存储区,直到退出运用实例,避免了函数调用时压栈出栈,速度快了很多。
- static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝,节省单次调用函数时的空间。