1.static基本原理
Static:中文翻译为静态、静止的意思。在C语言中static是一个用来修饰变量与函数的关键字,被修饰对象的某些性质将发生根本性的改变,而这些变化从某种意义上又似乎契合了“静态”这一含义。那接下来就详细讲一讲static这个关键字的用法吧~
static修饰的变量在一个程序只会执行一次,之后就不会发生改变了。本质上是因为static修饰的局部变量存储位置改变了,局部变量是存储在栈区内,而静态变量则是存储在静态区内(如下图)。而这种改变带来的影响就是使得局部变量的生命周期变得和整个程序一样长,即:局部变量出了其作用域也将不会销毁,除非程序结束。值得注意的是虽然局部变量的声明周期得到了很大的提升,但他的作用域没有发生任何的改变,还是只能在那个局部的范围内使用。
2.static常见应用
static有三种不同的用法:1.修饰局部变量,2.修饰全局变量,3.修饰函数。
2.1修饰局部变量
局部静态变量在函数调用之后不会被销毁,而是保持其值.
#include<stdio.h>
void test_1()
{
static int a =0;
a++;
printf("a = %d\n",a);
}
int main()
{
for (int i = 0; i < 3; i++)
{
test_1();
}
return 0;
}
作用:统计函数的调用次数、记录某个状态的变化
运行的结果为:
由此可见在函数调用完成之后,static修饰的局部变量的值没有清除,而是保留了计算的值。这是因为局部变量经过static后,存储的位置由栈区转移到了静态区。
2.2 修饰全局变量
全局静态变量:只可以使其在声明所在的文件内可见。这样可以避免与其他文件中相同名称的变量产生冲突。
我们知道全局变量在不同的源文件中是可以使用的,只不过需要先用extern外部声明一下。但如果用static给这个全局变量进行修饰将发生执行错误的结果:
报错的原因是:无法解析外部指令,出现这种现象的根本原因是:全局变量是具有外部链接属性的,而static修饰的全局变量的时候就把这个外部链接属性变成了内部链接属性。这就导致其他源文件不能使用该全局变量了。所以你才会感觉似乎全局变量的作用域变小了,但生命周期不变,仍是整个工程。其他文件就不能使用该变量了。
2.3修饰函数
静态函数:这种函数只能在声明所在的文件中内部调用,无法被其他的文件直接调用。
作用:常用于作为辅助函数、实用函数。
static修饰函数其实和全局变量差不多,因为函数也具有外部链接属性,被static修饰后就变成内部链接属性了,其他源文件不能再使用。其他文件就不能使用该函数了。
-
限制作用域:static 关键字将变量的作用域限制在当前文件内部,它只能在声明它的文件中被访问,而不会对其他文件可见。
-
避免冲突:通过使用 static 限定符,可以在不同的文件中使用相同的变量名而不会产生冲突,因为它们处于不同的作用域内。
-
模块化:static 可以帮助实现代码模块化,因为它允许将变量限制在特定的文件或函数内部,有助于维护和理解代码逻辑。