在c语言中,static是用来修饰变量与函数的,主要分为:
- 修饰局部变量
static修饰的局部变量只执行一次,延长了局部变量的生命周期,让静态局部变量出了作用域依然存在,直到程序运行结束后才被释放。
例如:代码1
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
for (int i = 0; i < 10; i++)
{
test();
}
return 0;
}
它的结果为1 1 1 1 1 1 1 1 1 1,因为函数被调用一次,i销毁重建,但是如果加上static关键字,例如代码2
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
for (int i = 0; i < 10; i++)
{
test();
}
system("pause");
return 0;
}
它的结果为1 2 3 4 5 6 7 8 9 10,因为加上了static关键字,i成为一个静态变量,不会销毁
- 修饰全局变量
static修饰全局变量时,此全局变量只能在本文件内使用,不能在其他文件中访问,即使是extern外部声明也无用
例如:
add.c
int val = 2019;
test.c
int main()
{
extern int val;
printf("%d\n", val);
return 0;
}
它的结果为2019,因为使用了extern外部声明,不会出现连接错误
但是如果加上static关键字,例如
add.c
static int val = 2019;
test.c
int main()
{
extern int val;
printf("%d\n", val);
return 0;
}
代码出现错误,无法运行。
- 修饰函数
static修饰函数,这个函数只能在此源文件中调用,不能被其他源文件调用,道理与修饰全局变量相同。
总结:static修饰的局部变量存放在全局数据区的静态变量区,自动初始化为0.
const与const
例如:int const*a,可以看成int const(*a),const修饰a所指向的值,即值不能变,a所保存的地址可以变,而 int *const a可以看成 int *(const a),const修饰a所保存的地址,即地址不能变,而a所指的值可以变。