static是C语言中的关键字,它的作用大致分为3种:
- 修饰局部变量
- 修饰全局变量
- 修饰函数
1.修饰局部变量
例如:
当局部变量a未被static修饰时,
void test();
int main()
{
int i;
for (i = 0;i < 10;i++)
{
test();
}
return 0;
}
void test()
{
int a = 0;
a++;
printf("%d", a);
}
输出结果为:1111111111
而当a被static修饰以后,
void test();
int main()
{
int i;
for (i = 0;i < 10;i++)
{
test();
}
return 0;
}
void test()
{
static int a = 0;
a++;
printf("%d", a);
}
输出结果为:12345678910
原因是当static修饰局部变量a之前,变量a在每次进入test函数之前都会重新赋值,test函数执行完后变量a被自动销毁,下一次循环又重新赋值,所以每次打印的结果都为1;而当变量被static修饰以后,变量a第一次进入test赋值以后,执行完test函数之后不会销毁,所以下一次循环进入test函数时a的值为上一次test执行的结果。
本质原因:用以下表格表示内存空间:
内存区域 | 存储内容 |
栈区 | 局部变量 |
函数的参数 | |
堆区 | 动态内存分配 |
…… | |
静态区 | 全局变量 |
static修饰的局部变量 |
当static修饰局部变量之后,局部变量由之前的存放在栈区变为存放在静态区,生命周期与全局变量的生命周期相同。
2.static修饰的全局变量
C语言常量与变量在这篇文章中说过,如若要使用同一工程中其他源文件中的全局变量,需用关键字exten声明,即可调用。但如若该被调用的全局变量被static关键字修饰了,则无法进行调用。例如在第一个源文件中,定义全局变量a,但此时全局变量被static修饰:
#inclue <stdio.h>
static int a=100;
int main()
{
printf("%d",a);
return 0;
}
当在第二个源文件调用时:
#include <stdio.h>
int main()
{
extern int a;
printf("%d",a);
return 0;
}
此时会报错无法执行,原因是全局变量a被static修饰之后只能在本身所在的源文件中使用,本质原因是外部链接属性被static修饰之后变为内部链接属性。
3.static修饰函数
函数与全局变量一样,在跨源文件调用时,也需要用extern函数提前声明,例如:
在第一个源文件中定义函数:
void Add(int x,int y)
{
printf("%d",x+y);
}
在第二个源文件中调用Add函数,需要预先声明:
extern void Add(int,int)
int main()
{
int a = 1, b = 2;
Add(a, b);
}
但是当函数在第一个源文件中被static修饰以后,该函数只能在第一个源文件中使用,在第二个源文件中无法调用。
static void Add(int x,int y)
{
printf("%d",x+y);
}
此时若在第二个源文件中调用,程序无法执行。