C语言中,static关键字有多种作用,经常弄的人头晕,今天我们就来看一下,static的作用。
目录
static修饰局部变量
void test();
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
system("pause");
return 0;
}
void test()
{
int a = 0;
a++;
printf("%d ", a);
}
上面的代码是 调用test函数打印变量a的情况,从结果可以看到,test函数每调用一次,a就会被重新赋值,所以打印了十个1。
void test();
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
system("pause");
return 0;
}
void test()
{
static int a = 0;
a++;
printf("%d ", a);
}
再用static修饰了a以后,输出结果变为1到10,这是因为static改变了变量a的生命周期,变量是存放在内存的栈区中(生命周期随着所处代码块的结束就结束了),修饰过后变量被转移到静态区(生命周期变为了整个工程)
上图说明static修饰后,每一次运行test函数时,都没有创建变量a。
static修饰全局变量
我们先了解下全局变量的作用域和范围
第一张图的代码,引用了下面这张图的全局变量,这里可以看到全局变量的作用域在整个工程,不会被源文件所限制。
这里, 用static修饰变量!!!
编译器给出(1 error LNK2001: 无法解析的外部符号 _a )
这是全局变量本身具有的外部链接属性,被static修饰后,变为了内部链接属性,无法被别的源文件引用。
static修饰函数
上图之前,我们先了解下函数也具有连接属性,也分为内部和外部
这是在2号源文件定义的函数
1号源文件这里,经过extern的引用
输出的结果是30。
经过static修饰后
程序不出意外的报错了,结果和全局变量类似,_add是外部符号,无法被引用。
所以,static修饰函数时,也是将函数的外部链接属性,变为内部,相当于改变了函数的作用域。