拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 [深度解剖C语言] --关键字 static

[深度解剖C语言] --关键字 static

白鹭 - 2022-03-08 2075 0 0

static ---最名不副实的关键字

目录

1.static修饰全域变量

2.static修饰函式

3.static修饰区域变量


static的作用:

1.static修饰全域变量

我们创建两个源档案,一个test.c,一个main.c

现在我们在test.c档案下定义一个全域变量

int g_val = 100;

我们在main.c下进行呼叫打印g_val我们能访问到g_val吗?

答案是可以的

如果给g_val加上static修饰我们还能再main.c下访问到吗?

static int g_val = 100;

这时候答案是不行的!

因此我们得到了static的第一个结论

结论1:static修饰全域变量,该变量只在本档案内被访问,不能在其他档案被直接访问,

2.static修饰函式

我们在test.c档案下写一个show()函式,请问在main.c档案能呼叫吗?

答案是可以的,

那这时候给show()函式加上static,main.c下还能呼叫该函式吗?

答案是不可以的!因此我们可以得到第二个结论

结论2:static修饰函式,该函式只能在本档案内被访问,不能被其他档案访问,但是可以通过嵌套的方式呼叫,变相的封装的表现,

但是我们可以通过函式嵌套呼叫的方式呼叫show函式,

什么意思呢?就是在show函式的相同档案内创建一个新的函式,呼叫show函式,我们再在main.c档案下呼叫这个新的函式,已达到呼叫show()函式的目的,

例:我们创建一个show_helper函式,来呼叫static修饰的show函式,我们再在main.c档案内呼叫show_helper函式,

结果:

通过嵌套的方式呼叫,变相的封装的表现,

因此static项目维护,可以提供安全保护,被static修饰,主要限制的是作用域,

3.static修饰区域变量

void fun()
{
	int i = 0;
	i++;
	printf("i = %d\n", i);
}

int main()
{
	for (int i = 0; i < 10; i++)
	{
		fun();
	}
}

你知道这段代码,它的运行结果是什么吗?

通过结果我们发现他打印了10个1,其中,i是区域变量,具有临时性,函式呼叫时开辟空间并初始化,函式结束释放空间,

那么如果我们static修饰区域变量,即给int i = 0;前static所修饰,结果还会一样吗?

void fun()
{
	static int i = 0;
	i++;
	printf("i = %d\n", i);
}

int main()
{
	for (int i = 0; i < 10; i++)
	{
		fun();
	}
}

答案当然是不一样的, 我们发现,结果变成了1-10,因此我们可以得到第三个结论,

分析:

结论3:static修饰区域变量,更改该区域变量的生命周期,

生命周期:将临时变量的生命周期变成全域变量的生命周期,

作用域不变:作用域仍然是代码块内,

总结:

static:

结论1:static修饰全域变量,该变量只在本档案内被访问,不能在其他档案被直接访问,

结论2:static修饰函式,该函式只能在本档案内被访问,不能被其他档案访问,但是可以通过嵌套的方式呼叫,变相的封装的表现,

结论3:static修饰区域变量,更改该区域变量的生命周期,
生命周期:将临时变量的生命周期 -- 全域变量的生命周期,
作用域不变:作用域仍然是在本代码块内,

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *