c语言-static关键字

目录

  • 前言
  • 一、static修饰局部变量
    • 1.1 无static修饰的局部变量
    • 1.2 有static修饰的局部变量(静态局部变量)
  • 二、static修饰全局变量
    • 2.1 无static修饰的全局变量
    • 2.2 有static修饰的全局变量(静态全局变量)
  • 三、static修饰函数
    • 3.1 无static修饰函数
    • 3.2 有static修饰函数(静态函数)
  • 总结

前言

读者在阅读过程中,如果发现文章不足之处,还请读者在评论区及时指出!!!

本篇文章目的是介绍c语言中static关键字的基本使用,希望通过本篇文章的介绍,可以让读者对c语言中的static关键字有一定的认识。
文章从static关键字修饰的不同对象入手,结合代码,分析static关键字在修饰不同对象时所体现的作用。
本篇文章总共分为3个大节,每个大节分为2个小节。
在c语言中,static关键字用来修饰局部变量、全局变量、函数三个对象,修饰的对象不同,体现的作用也不相同。

c语言-static关键字_第1张图片


一、static修饰局部变量

在无static修饰局部变量时,局部变量的存储位置在栈区(在运行期间分配内存),局部变量的生命周期为进入局部变量的作用域开始到离开局部变量的作用域结束;
在有static修饰局部变量时,局部变量的存储位置在静态区(在编译期间分配内存),局部变量的生命周期与整个程序的生命周期相同。

1.1 无static修饰的局部变量

//一般情况
void test() {
	int a = 1;
	a++;
	printf("%d ", a);
}
int main() {
	int i = 0;
	while (i < 10) {
		test();
		i++;
	}
	return 0;
}

输出结果:
c语言-static关键字_第2张图片
分析结果:
上面这个代码的作用是循环调用test() 执行十次,每次循环调用test()局部变量a都会被重新创建并初始化为1,然后自增1,a的值变为2,因此每次循环结果a的值都为2。
结论: 无static修饰的局部变量,每次循环时,局部变量a的值被重置。


1.2 有static修饰的局部变量(静态局部变量)

//有static修饰
void test() {
	static int a = 1;
	a++;
	printf("%d ", a);
}
int main() {

	int i = 0;
	while (i < 10) {
		test();
		i++;
	}

	return 0;
}

输出结果:
在这里插入图片描述
分析结果:
上面这个代码依然是循环调用test() 十次,与上面不同,static int a = 1;只会执行一次,往后的循环不会再执行初始化操作,第一次循环的后,a = 2,第二次循环后 a = 3,以此类推,直至循环结束。
结论: 有static修饰的局部变量,在每次循环时,局部变量a的值不会被重置,并作为下次循环的初始值。


二、static修饰全局变量

在无static修饰全局变量时,全局变量具有外部链接属性,即整个工程的其他源文件(xxx.c文件,xxx为文件名)可以通过extern关键字引入这个全局变量并且使用;
在有static修饰全局变量时,全局变量具有内部链接属性,即整个工程的其他源文件无法使用,仅在定义全局变量的源文件中使用。

2.1 无static修饰的全局变量

定义全局变量的源文件:global_val.c

//无static修饰的全局变量
int global_b = 100;

使用全局变量的源文件:test.c

//声明外部标识符
extern int global_b;

int main() {
//输出全局变量的值
	printf("global_b = %d \n", global_b);
	return 0;
}

输出结果:
在这里插入图片描述
分析结果:
global_val.c源文件定义全局变量global_b,在test.c源文件中引入并使用全局变量。
结论: 在无static修饰全局变量时,其他源文件可以引入并使用全局变量。


2.2 有static修饰的全局变量(静态全局变量)

定义全局变量的源文件:global_val.c

//有static修饰
static int global_c = 300;

使用全局变量的源文件:test.c

//声明外部标识符
extern int global_c;

int main() {
	printf("global_c = %d \n", global_c);
	return 0;
}

输出结果:
在这里插入图片描述
分析结果:
global_val.c源文件定义全局变量global_c,在test.c源文件中无法引入和使用全局变量。
结论: 在有static修饰全局变量时,其他源文件无法引入并使用全局变量。


三、static修饰函数

在无static修饰函数时,函数具有外部链接属性,函数可以被其他源文件使用;
在有static修饰函数时,函数具有内部链接属性,函数无法被其他源文件使用。

3.1 无static修饰函数

声明函数的func_test.c文件

//声明add函数
int add(int x, int y) {
	return (x + y);
}

使用add() 函数的test.c文件

//声明add函数
int add(int, int);

int main() {
	int x = 10;
	int y = 20;
	int sum = add(x, y);
	printf("sum = %d\n", sum);
	return 0;
}

输出结果:
在这里插入图片描述
分析结果:
test.c源文件中使用func_test.c源文件中的add() 函数,正确输出结果。
结论: 在无static修饰函数时,其他源文件可以使用另一个源文件声明的函数。


3.2 有static修饰函数(静态函数)

声明函数的func_test.c文件

//声明减法函数,使用static修饰
static int sub(int x,int y) {
	return (x - y);
}

使用sub() 函数的test.c文件

//有static修饰
//声明sub函数
int sub(int, int);

int main() {
	int x = 20;
	int y = 10;
	int r = sub(x, y);
	printf("%d\n", r);
	return 0;
}

输出结果:
在这里插入图片描述
分析结果:
test.c源文件中无法使用func_test.c源文件中的sub() 函数。
结论: 在有static修饰函数时,其他源文件无法使用被static修饰的函数。


总结

本篇文章阐述了c语言中static关键字的作用,static修饰的对象有三个:局部变量、全局变量和函数。修饰的对象不同,static关键字所体现的作用不同,在程序中的应用场景也就不同。

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