【C语言】C语言中关键字static的用法

C语言中 存在关键字static 顾名思义意思为静态的
那什么是静态的呢?
本文就static的三种用法对static的"静态"做出解释

【C语言】C语言中关键字static的用法_第1张图片
在msdn中,对static关键字做出了以上解释,但是很难理解,所以接下来我就用代码的方式对static关键字做出解释

static修饰局部变量

static关键字的第一种用法就是修饰局部变量

#define _CRT_SECURE_NO_WARNINGS 1
#include
int f(int x)
{
	int a = 0;//每次调用函数时都在f函数中重新创建a变量
	a++;//a变成1
	printf("%d\n", a);//打印a=1;
}
int main()
{
	int a = 0, i = 0;
	for (i = 0; i < 10; i++)//循环调用十次f函数
	{
		f(a);
	}
	return 0;
}
//所以程序最后运行的结果为十个1;

如果在f函数中定义a变量时,结果会如何呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include
int f(int x)
{
	static int a = 0;//调用该函数时跳过该语句
	a++;//a=a+1;
	printf("%d\n", a);//打印a=1;
}
int main()
{
	int a = 0, i = 0;
	for (i = 0; i < 10; i++)//循环调用十次f函数
	{
		f(a);
	}
	return 0;
}

先看结果【C语言】C语言中关键字static的用法_第2张图片
我们发现竟然不是打印十个1,而是从1开始打印到10

为什么会出现这种情况呢?

其实这就是static发挥的作用
我们知道,在计算机中,内存可以简单划分为栈区,堆区和静态区,在第一种情况下,在创建a变量时没有加static,所以他被存放在栈区,栈区的特点是在函数执行完之后,创建该变量时创建的空间就被释放了,所以每次进入f函数都会重新创建a变量,所以打印十个1.

而第二种情况,在第一次进入f函数时,创建变量a时用static修饰,使得变量a被存放在内存中的静态区,而静态区的特点是在****程序结束后该变量所占用的内存才释放,所以在出f函数时,a变量并没有被销毁,而是保存下来,在下一次调用f函数时,不会再创建a变量,而是跳过执行之后的语句。

这就是static修饰局部变量时造成的效果

static修饰全局变量

第二种是static修饰全局变量
话不多说先上代码。
【C语言】C语言中关键字static的用法_第3张图片
在这里我在同一个项目中创建了两个.c文件一个test.c一个test2.c;
我在test2.c文件中创建了全局变量a,我们知道全局变量的作用范围是整个项目
所以我在test.c中声明了a之后就可以调用a,可以打印出来10;

如果我在a变量前用static修饰呢?

话不多说,直接上代码
【C语言】C语言中关键字static的用法_第4张图片
我们发现代码竟然报错了 报错信息是无法解析的外部符号
说明即使在test.c文件中声明了a,还是无法使用
这就是static修饰全局变量的效果

之所以会出现这种情况,是因为全局变量a在经过static修饰后成为静态全局变量
静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
所以无法调用,这就是static修饰全局变量

static修饰函数

第三种是static修饰函数,其实static修饰函数和修饰局部变量的用法基本相同
还是相同的情况
直接上代码
【C语言】C语言中关键字static的用法_第5张图片
还是在同一个项目中创建两个文件一个test.c 一个test2.c;
我们在test2.c中定义了一个print函数,在test.c中声明后调用可以正常运行

那我们用static修饰print函数后还会打印出来a的值吗?

【C语言】C语言中关键字static的用法_第6张图片
可以看到,在定义函数前用static关键字修饰,编译器报错,报错原因是无法解析的外部符号.
所以我们知道,在test.c文件中没有传入test2.c文件的函数print
原因很简单,其实我们发现和static修饰全局变量的形式十分相似,所以原因也和static修饰局部变量相同.

到这里我们对static的用法已经有了充分了解

希望我的博客能对你的学习有所帮助,如果有错误欢迎积极指出。

所用编译器 VS2022

你可能感兴趣的:(C语言,c语言,数据结构)