初识c语言之static关键字

static的作用

1.static修饰全局变量

全局变量的生命周期是整个工程。当我们跨文件调用一个全局变量的时候,只需要用关键字extern就能实现(上一篇博客介绍了extern和全局变量局部变量的生命周期)。
在这里插入图片描述
如果在局部变量的前面加上static,那么程序会有怎样的改变。
在这里插入图片描述
代码的运行结果显示“无法解释外部符号a”,由于全局变量具有外部链接属性,对全局变量加上static修饰后,使全局变量失去了外部链接属性,只有内部链接属性,使其全局变量的作用范围减少。

2.static修饰局部变量

想搞清楚static修饰全局变量会使程序发生什么变化首先观察下面的代码运行的结果有什么不同
代码一:

void test()
{
	int a = 0;
	a++;
	printf("%d", a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
}
在这里插入代码片

在这里插入图片描述
代码二:

#include<stdio.h>
void test()
{
	 static int a = 0;
	a++;
	printf("%d", a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
}

在这里插入图片描述
对比代码一和代码二的结果我们不难发现,代码一打印了10个一,代码二打印了1到10的所有整数,为什么 在变量的前面加了static会导致结果不一样呢?要想弄清楚这个问题,首先我们得知道内存的分布。
在这里插入图片描述
代码一:
当代码进入while循环后调用test函数,进入test函数后在栈区区中创建函数,并在栈区中创建了局部变量a,当第一次test函数调用结束后在内存中创建的函数和变量立刻销毁由操作系统回收。第二次调用test函数的时候又在栈区中重新创建函数和变量,出了函数又销毁直到循环走完。所以局部变量的生命周期只是在某个范围,出了这个范围立马销毁由操作系统回收。
代码二:
代码二连续打印出1到10的数字,证明当第一次调用test函数结束后在内存中创建的变量和函数并没有销毁由操作系统回收而是继续保存在内存中。每次进入test函数a的值一直在内存中保存并没有销毁,每次都自增1,所以连续打印出1到10的数字。
总结:static修饰局部变量是直接改变变量在内存中的存储位置,把变量由栈区改变到存储到静态区,让局部变量拥有和全局变量一样的生命周期期,其生命周期是整个工程。

3.static修饰函数

在这里插入图片描述
当我们给变量加上static:
在这里插入图片描述
函数被static修饰后具有和全局变量一样的效果使其失去外部属性,只有内部属性。使其作用域变小。


版权声明:本文为weixin_65846395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。