在C语言中,static是用来修饰变量和函数的,可以修饰局部变量全局变量和函数。
我们来讲讲这三种用法:
1.修饰局部变量
这是当前的代码,一个while循环
void test()
{
//修饰局部变量
int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
输出结果为:
当我们在 int a前加上static的时候
void test()
{
//修饰局部变量
static int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
输出结果为:
结果大有不同,当函数中的变量a被static修饰了之后,它的生命周期就被改变了。所以当static修饰局部变量的时候,局部变量除了作用域是不销毁的。本质上,static修饰了局部变量的时候,也是改变了变量的存储位置的。
本来存放在栈区的局部变量被static修饰之后,它就不会放在栈区了,而是放在了静态区中,只有当程序执行结束之后,被static修饰的的局部变量才会销毁。
2.修饰全局变量
现在我可以利用extern 调用外部变量 g_val(extern不懂可以参考主页框架文章)
//修饰全局变量
/声明外部符号
extern int g_val;
int main()
{
printf("%d\n", g_val);
return 0;
}
当我们把这个全局变量加上static的时候,我们就无法调用它了。
static int g_val = 2022;
说明了什么呢?
全局变量本是拥有外部链接属性的,当被static修饰之后, 这个时候这个全局变量的外部链接属性就变成了内部链接属性,其他源文件无法调用。这就是static修饰全局变量的作用。
3.修饰函数
修饰函数也非常简单,一个函数本来也是具有外部链接属性的,但是被static修饰的时候外部链接属性就变成了内部链接属性,其他源文件就无法使用。