在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
修饰变量
静态全局变量
有以下两点注意:
1.修饰后的全局变量的作用域仅限于其所在的文件(例如:.c .h)中使用
2.不能够外部声明,例如使用(extern)
静态局部变量
静态局部变量使用的范围就更小了,只能在其所在的函数内部使用;就算在同一个文件中,也无法使用;
注意:由于static修饰的变量储存在内存的静态区,函数如果经过多次调用运行,正常未被static修饰的变量每次在函数退出前都会被销毁,但是static修饰后,会让变量的生命周期变长,不会销毁,下次调用函数的时候,上次变量运行的结果依旧保存,继续使用;
通过以下代码测试验证
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
static int j;
void fun1(void)
{
static int i = 0;
i++;
}
void fun2 (void)
{
j = 0;
j++;
}
int main()
{
int k = 0;
for (k = 0; k < 10; k++)
{
fun1();
fun2();
}
return 0;
}
注意观察每次进入fun2后变量 j 都会被清零
原因:执行了 j=0 后当然保存不了上一次的值
经过调试你会发现程序进入函数内部,会跳过执行 static int i ;没有执行当然不会改变
最终结果如下
当然你可能会问为什么 j 没有清零;因为只有当进入函数执行的时候才会执行变量的赋值
修饰函数
static修饰变量用的最多,当然也可以用来修饰函数了;
通过以下代码测试验证
//代码1
//add.c
int Add(int x, int y)
{
return x + y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));//5
return 0;
}
运行成功
//代码2
//add.c
static int Add(int x, int y)
{
return x + y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
出现错误 ;找不到Add函数
error: LNK2019: 无法解析的外部符号 Add,函数 main 中引用了该符号
结论:
static修饰局部变量
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束
static修饰全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用
static修饰函数
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用