在 C 语言中:static 是用来修饰变量和函数的1. 修饰局部变量 - 称为静态局部变量2. 修饰全局变量 - 称为静态全局变量3. 修饰函数 - 称为静态函数
1. 修饰局部变量-称为静态局部变量
我们来看一下第一种修饰局部变量的情况
第一段代码:
//代码1
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0; }
结果:
第二段代码:
//代码2
#include <stdio.h>
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
结果:
通过这两段代码的结果我们可以发现:
在代码1中,test()函数中定义的变量 i没有被static关键词修饰,出了它作用域就自动销毁了,每次调用test()函数,这个变量 i 都会重新创建并初始化为0。
而代码2中,test()函数中定义的变量 i 被static关键词修饰,即使出了它作用域也没有自动销毁,每次调用test()函数,这个变量 i 都会上一次的结果,一直到整个程序结束,才会销毁。
结论:
static 修饰局部变量改变了变量的生命周期让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
2. 修饰全局变量-称为静态全局变量
从上面的代码可以看出,在test1文件中定义的全局变量 a 在 test文件中可以被打印。
这说明:全局变量具有外部链接属性。
补充:
extern ——是专门用来申请外部符号的关键字,如果想要使用来自其他文件(外部文件)的全局变量,需要先声明!
当我们给这个全局变量用 static 修饰以后会发生什么呢?
我们可以发现,被 static 修饰以后,其他文件就无法使用这个全局变量了
结论:
当一个全局变量被static修饰时,这个全局变量的外部链接属性就变成了内部链接属性,使得这个全局变量只能在自己的源文件内部使用,其他文件不能再使用。
3. 修饰函数-称为静态函数
从上述代码中可以看出,在 test1.c 源文件中定义了一个 add 函数,在 test.c 中是可以正常被调用使用的。
如果 add 函数被 static修饰时,会发生什么呢?
我们可以看到当 test1.c 源文件中的 add 函数被 static 修饰时,就无法在test.c 源文件中被调用使用了。
结论:
static修饰函数时,函数本身也是具有外部链接属性的,被static修饰时,就变成了内部链接属性。
使得这个函数只可以在本源文件内部使用,不能在其他源文件内使用。