C语言关键字——static和extern

大家好,今天和大家分享C语言中的两个关键字以及作⽤域和⽣命周期的有关知识,创作不易,三连支持一下吧!

812dd1a160274e53b45d2b148cd7ba71.gif

c0e3a43d0eb344789b45f8c5ab1fdac5.jpeg

一、作用域和生命周期

在了解static和extern之前,我们先了解一下作用域和生命周期。

1.作用域

作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
局部变量的作⽤域是变量所在的局部范围;
全局变量的作⽤域是整个⼯程(项⽬)。

如:8f08d0db0af24861bc4ad1ec31571eed.png

9e5de85a58c841b988438734bf068d4b.png

那我们又有疑问了,局部变量和全局变量都在怎么办——采用就近原则,就是优先使用该作用域的变量,也就是优先使用局部变量。但不允许同一个作用域定义多个相同的变量名,会产生冲突。

如:

3b6a178c73944267a1f75133600264bc.png

2.生命周期

⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
全局变量的⽣命周期是:整个程序的⽣命周期。

我也可以理解为变量的存活时间。如:fec40b04a16347d3ba4ffa2f8e11676f.png
d7d8b2c69d1344af9f62bbfb34e54a79.png

作用域和生命周期与函数栈帧的创建与销毁有关,函数栈帧的创建与销毁我们在后面会具体学习。

二、static和extern

static和extern都是C语⾔中的关键字。
static是静态的 的意思,可以⽤来:
• 修饰局部变量
• 修饰全局变量
• 修饰函数
extern是⽤来声明外部符号的。

下面我们就具体学习它们的功能和用法。

1.static修饰局部变量

我们先来看两段代码:

0e6e6fa9329a4c7180fa0839641a7f2b.pnge492cb8493804b5899944044c2d67d07.png

我们可以看得到这两段代码的运行结果不一样,仅仅是因为多了一个static。

代码1的fun函数中的局部变量i是每次进⼊fun函数先创建变量(⽣命周期开始)并赋值为0,然后++,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。
代码2中,我们从输出结果来看,i的值有累加的效果,其实fun函数中的i创建好后,出函数的时候是不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。

所以我们得出结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收,但是作⽤域不变。
接下来我们画图理解一下:cd1081e708e54235b400749a19b2121c.png

我们知道内存分为栈区,堆区和静态区,一般局部变量和函数参数存放在栈区,而静态变量和全局变量存在静态区,当局部变量前加上static后就变成了静态变量。未来⼀个变量出了函数后,我们还想保留值,等下次进⼊函数继续使⽤,就可以使⽤static修饰。

2.static修饰全局变量

我们还是先来看两段代码:

c0d0b8096c2f4b1587ce9aadc9b3c106.png6eacaef891d24e9db42b6c8185aa6851.png

在这里,extern是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤ extern 进⾏声明,然后使⽤。

我们可以看到第一段代码可以正常运行,第二段代码报了错。

⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。

本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。

所以:如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤
static修饰。

3.static修饰函数

先来看两段代码:

0acf4e97f8c94350b445bb03410c7417.png7aba730f8d1443c888744068b663d761.png

第一段代码是能够正常运⾏的,但是第二段代码就出现了链接错误。

所以我们可得出结论: static 修饰函数和static 修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤,被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。

本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件部使⽤。
所以以后我们想要⼀个函数只想在所在的源⽂件内部使⽤,不想被其他源⽂件使⽤,就可以使⽤ static 修饰。

好了以上就是本文的全部内容了,感谢大家的观看,有错误的话欢迎指正。三连支持一下再走呗💕

4cdc1af400164834a4366bbbb4eec4f0.jpg

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值