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

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


在msdn中,对static关键字做出了以上解释,但是很难理解,所以接下来我就用代码的方式对static关键字做出解释

static修饰局部变量

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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<stdio.h>
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;
}

先看结果
我们发现竟然不是打印十个1,而是从1开始打印到10

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

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

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

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

static修饰全局变量

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

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

话不多说,直接上代码
在这里插入图片描述
我们发现代码竟然报错了 报错信息是无法解析的外部符号
说明即使在test.c文件中声明了a,还是无法使用
这就是static修饰全局变量的效果

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

static修饰函数

第三种是static修饰函数,其实static修饰函数和修饰局部变量的用法基本相同
还是相同的情况
直接上代码
在这里插入图片描述
还是在同一个项目中创建两个文件一个test.c 一个test2.c;
我们在test2.c中定义了一个print函数,在test.c中声明后调用可以正常运行

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

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

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

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

所用编译器 VS2022

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉着的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值