static - 静态的
C语言中static可以修饰
局部变量
全局变量
修饰函数
首先 我们来看以下代码
#include<stdio.h>
void test()
{
int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
} //打印: 2 2 2 2 2 2 2 2 2 2
我们可以看到在循环中,我们会调用10次test函数,但在test函数中,a每次都被重新定义,所以每次调用test函数时,a的值都被重置为1,所以会输出十个2。
那么怎么才能改变现状呢?
这时我们就会需要static语句
我们用static修饰一下int a 代码变化如下所示
#include<stdio.h>
void test()
{
static int a = 1; //此行加了static
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
} //打印2 3 4 5 6 7 8 9 10 11
相信大家已经发现了不同
a 在离开函数后并没有被销毁,且没有被再次赋值,每一次使用的a都是上次调用留下的a。
在这里简单简单的提一下有关内存的知识
内存是一块比较大的存储空间
在使用内存时会划分出不同的功能区域
栈区、堆区、静态区
存储时不同类型的数据会分开储存
堆区我们暂时无视
局部变量存储在栈区
静态变量和全局变量存储在静态区
当我们用static修饰后,原本存储在栈区的局部变量就存储在的静态区,就变成了静态变量
static修饰局部变量的时候,其实是改变了变量的存储类型(栈区存储>>静态区)
从而使得静态的局部变量失去了局部变量的特性,出了作用域也不会销毁,相当于改变了生命周期
如果修饰了全局变量呢?
报错: g_val未声明的标识符
首先 如果我们想使用其他文件的全局变量,要用extern关键字,是专门用来声明外部符号的
这样我们就可以使用其他文件的定义,代码正常运行。
回归正题 如果修饰了全局变量
报错无法解析的外部符号 g_val
这是因为一个全局变量在整个工程的其他文件能被使用是因为全局变量具有外部链接属性。
当一个全局变量被static修饰的时候,这个变量的外部链接属性就变成了内部链接属性,使得这个全局变量只能在自己所在的源文件内部使用,其他文件不能再使用,给我们的感觉是作用域变小了。
修饰函数
同样,我们修饰一个外部函数
得到的结果为30,代码正常运行,说明函数也有外部链接属性。
但当我们用static修饰了这个函数
我们看到编译器再次报错,且和全局变量十分相似。
得知函数本来也是具有外部链接属性。被static修饰之后,就变成了内部链接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用,给我们的感觉是改变了作用域。
所以我们发现修饰全局变量和函数时的效果是相同的