C语言关键字static

static的英文解释是静态的,那static的作用是什么呢?

总的来说,static主要用在三个地方:

1.static修饰局部变量

2.static修饰全局变量

3.static修饰函数

目录

static修饰局部变量

static修饰全局变量

static修饰函数

 接下来,分别从这三个方面入手介绍static。

static修饰局部变量

 首先,看一段这样代码:

//代码1
#include 
void test()
{
	int a = 2;
	a++;
	printf("%d\n",a);
}
int main()
{
	int i = 0;

	while (i < 5)
	{
		test();
		i++;
	}
	return 0;
}

上段代码的输出结果是:

3 3 3 3 3

这很容易理解吧,就不解释啦。

接下来,只在上段代码做一点修改:在test()函数中,int  a = 2创建时,前面加上static关键字,即static int  a = 2,修改后代码为:

//代码2
#include 
void test()
{
	static int a = 2;
	a++;
	printf("%d\n",a);
}
int main()
{
	int i = 0;

	while (i < 5)
	{
		test();
		i++;
	}
	return 0;
}

这次的输出结果为:

3 4 5 6 7

两次结果不同的原因肯定就是因为加上static关键字了。对比代码1和代码2,可以理解static的作用:

static修饰局部变量改变了变量的生命周期。
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

说人话,就是,局部变量出了作用域不会销毁(空间不会回收),下一次进入test函数内部时,a的值不会重新创建,仍然是上次离开test时a的值。(第一次进入test函数内部时a为自己定义的值)

那么为什么加上static关键字后,会产生这样的效果呢?本质是什么?

C语言关键字static_第1张图片

总结:

本质上:static 修饰局部变量使得变量的存储位置发生了变化(栈区->静态区)

本来局部变量是放在栈区,被static修饰后,放在内存的静态区,感觉是生命周期变长了

作用域没有变化

static修饰全局变量

C语言关键字static_第2张图片

在add.c源文件中,定义了变量g_val,在另一个源文件test.c中如果使用extern声明g_val的话,那么在test.c可以使用g_val。

注:声明外部符号extern,就是告诉编译器有一个变量叫:g_val,它的类型是int,来自外部文件。

如果在add.c里用static修饰g_val,那么看下图:

C语言关键字static_第3张图片

 会报错~。

总结:

static 修饰全局变量后,使得这个全局变量只能在自己所在的源文件内部使用,其他源文件无法使用。本来一个全局变量是具有外部链接属性的,只要合理的声明,全局变量在其他源文件内部,可以使用。而被static 修饰后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了。

 static修饰函数

和static修饰全局变量相似,本来函数是具有外部链接属性的,在其他源文件内部可以被调用,被static修饰后,外部链接属性就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,其他源文件无法使用。

C语言关键字static_第4张图片

static关键字就讲到这里了,写文章不易,若各位看官还算满意,请一键三连哦,谢谢各位啦~

你可能感兴趣的:(开发语言,c语言)