C语言函数(二):详解static和extern

static和exteren都是C语言中的关键字
static静态的意思,可以用来:

修饰局部变量
修饰全局变量
修饰函数

extern是用来声明外部变量的。
而在说明static和extern关键字的时候,我们有必要了解一下生命周期作用域的概念
作用域(scope)是程序设计概念,通常来说,一段代码中所用到的名字所起作用并不是总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域
1.局部变量的作用域是变量所在的局部范围
2.全局变量的租作用域是整个项目

局部变量在大括号里定义,全局变量在大括号外定义

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
1.局部变量的生命周期是:进入作用域创建,生命周期开始,出作用域生命周期结束
2.全局变量的生命周期:整个项目的声明周期

static修饰局部变量

不用static修饰局部变量的代码:

#include
void test(void) {
	int i = 0;
	i++;
	printf("%d ", i);
}
int main() {
	for (int i = 0; i < 5; i++) {
		test();
	}
	return 0;
}

在这里插入图片描述
上述代码因为每次进入循环跳转到test函数的时候,i的值都被重置为0,再加一,所以打印5个1。

用static修饰局部变量的代码:

#include
void test(void) {
	static int i = 0;
	i++;
	printf("%d ", i);
}
int main() {
	for (int i = 0; i < 5; i++) {
		test();
	}
	return 0;
}

在这里插入图片描述
可以看出int i=0;这段代码并没有重置i的值,这就是在其前面加上了static起到的作用
所以,再局部变量之间加上static关键字,这个局部变量在出函数的时候是不会销毁的,重新进入函数也不会重新创建变量,直接上次累计的数值继续计算。
结论:static修饰局部变量改变了变量的生命周期,使其从在局部范围的生命周期扩大至争个程序的生命周期。
使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以在这个变量之前加入static

static修饰全局变量

extern是用来声明外部符号的,如果一个全局变量在另一个文件中定义,那么在此文件中则要使用extern进行变量的声明,然后再使用。
比如创建两个.c文件

int year = 2024;
#include
extern int year;
int main() {
	printf("%d\n", year);
	return 0;
}

这样就能链接外部全局变量进行使用了,如果在全局变量year之前加上static会出现什么效果呢

 static int year = 2024;

继续运行上述代码,结果为在这里插入图片描述
从以上结果可以得出加入static之后,全局变量的作用域变小了,从以前的所有文件都可以使用变为只能在自己的源文件中使用。
结论:全局变量默认是具有外部链接属性的,在文件外部使用只要适当的声明就行了。但是在全局变量被static修饰以后,外部连接属性就变为内部链接属性,只能在自己所在的源文件内部使用了,其它源文件即使声明了,也不能正常使用。
使用建议:如果一个全局变量只希望在所在的源文件中使用,不想被其他源文件使用,就可以加上static修饰

static修饰函数

static修饰函数起到的作用和static修饰全局变量起到的作用是一样的。

int add(int x, int y) {
	return x + y;
}
#include
extern int add(int x, int y);
int main() {
	int x = 19, y = 20;
	printf("%d\n", add(x, y));
	return 0;
}

可以得出结果:C语言函数(二):详解static和extern_第1张图片
而在add函数之间加上static关键字后会出现什么效果呢

static int add(int x, int y) {
	return x + y;
}

在这里插入图片描述
结论:static修饰函数起到的作用和static修饰全局变量起到的作用是一样的。一个函数在前面加上static之后就会从外部连接属性变为内部连接属性,这样的这个函数就只能在自己的源文件中使用了,其他函数即使外部声明也不能使用。
使用建议:一个函数执行在所在的源文件中使用,而不想在其他文件中使用即可用static修饰该函数

/考研势在必行/

你可能感兴趣的:(C语言,c语言,java,算法,开发语言,考研,数据结构)