首先我们来看两段代码:
- 代码1(不加static)
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
运行结果如下:
- 代码2(加static)
#include <stdio.h>
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
运行结果如下:
对比以上两段代码,我们发现:
- 代码1:运行结果分析可知,test函数的局部变量i在每次进入test函数的时候都会重新创建并赋值为0,出函数的时候销毁。
- 代码2:运行结果可知,被static修饰过后的i,它的值是有累加效果的,在头一次进入test函数后,创建了i后,出函数是不会被销毁的。再次进入函数也不会重新创建变量,而是累积上次的数值继续计算。
出现结果2的原因:
- static修饰局部变量的时候,局部变量出了作用域是不会被销毁的。
- 不被销毁的原因是:static修饰的局部变量,本质上是改变了变量的存储位置。
- 存储位置的改变,实质上影响了变量的生命周期,生命周期变得跟程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。
- 但是变量i的作用域是不变的。
由上图可知:
- 栈区的数据特点是:进作用域创建,出作用域销毁。
- static修饰之后叫静态变量,静态变量是存放在静态区的,放在静态区的数据出了它的作用域不销毁,只有在整个程序结束的时候跟着一起销毁。
- 一旦变量创建之后,在整个程序执行过程中,它是不会换位置的,不会重新开辟空间。只不过本来在栈区,static修饰就在静态区。
使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static。