首先我们以两段代码为例,看看他们的运行结果分别是什么:
-
代码一:
#include <stdio.h>
void test()
{
int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
-
代码一的运行结果:
-
代码二:
#include <stdio.h>
void test()
{
static int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
-
代码二的运行结果:
观察两段代码,我们发现代码一与代码二的区别只有子函数test()中的变量num是否被static关键词所修饰,如果没有被修饰,则输出结果为10个数字1,如果被修饰则能连续输出数字1到10,为什么会出现这种状况呢?
分析:
- 不加static关键词修饰时,函数或代码块中的变量在函数或代码块第一次执行完毕后就会进行回收销毁,下次执行时重新分配新的内存,执行过后又会进行回收销毁。
- 加static关键词修饰时,函数或代码块中的变量在函数或代码块第一次执行时进行初始化并分配内存,就算函数或代码块执行完毕,该变量也不会被回收销毁,直到程序结束时static关键词所修饰的变量才会被回收销毁。
补充:
- 当static关键词作用于函数定义或代码块外的变量声明时,static关键字用于修改标识符的链接属性,它可以将外部链接属性转变为内部链接属性,但标识符的存储类型和作用域不会受到影响。也就是说此时变量或者函数只能在当前源文件中进行访问,不能在其他源文件中访问。
- 当static关键词作用于代码块内的变量声明时,static关键字用于修改变量的存储类型。从自动变量变为静态变量,变量的属性和作用域不受影响。
总结(两大特性):
记忆性:在函数多次调用时,能保持当前调用进入时调用的是上一次调用退出时的值
唯一性:每次调用都指向同一块内存