再浅谈一下static的应用

在上一篇文章中提到了static这一个关键字,但是后面我在仔细阅读我上一篇关于static的一些解释并不是特别到位,因此再次写出一篇关于static这一关键字在c语言中的作用,算是对上一篇文章的补充。

我们先来思考这样一段代码

#include <stdio.h>
int num(int m)
{
    int k = 0;
    static int n= 3;
    k += 1;
    n += 2;
    return ( m + n + k);
}
int main()
{
    int i;
    int m = 2;
    for (i = 0; i < 5; i++) 
    { 
        printf("%d,", num(m)); 
    } 
} 


A. 6 ,8,10,12,14

B.8,10,12,14,16

C.10,12,14,16,18

D.12,14,16,18,20

相信你们看了这代码心中已经有了自己的答案,我先说一下这道题的答案是 B ,但是如果对static这个关键字不熟悉的朋友会在想,艾这个static是啥来着,它在这里有什么作用?所以在这里就不得不提static的特性了。由此引出static的特性。

在C语言中:
static可用来修饰变量和函数:
1. 修饰局部变量-称为静态局部变量(看过上面代码就知道了k,n都是局部变量了吧,其中n就是那个被static修饰的局部变量)
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数

同时在c语言中将局部变量存储在栈中,全局变量存储在静态区为了直观理解,引入

可以看出普通的局部变量和函数和参数存放在栈区的,是临时的变量,这种局部变量进入作用域创建,出了作用域释放(回收)。

堆区为变量开辟动态内存空间,分配方式类似与数据结构的链表。

静态变量和全局变量是存放在静态区,放在静态区的数据创建后直到程序结束才释放。

当普通局部变量被static修饰后,这种变量就被存放到了静态区,放在静态区的变量,创建好后,直到程序结束才释放。从本质上来说,通过static修饰后,改变了局部变量的存储位置,因为存储位置得到差异,使得执行效果不一样了。其次被static修饰的变量它的作用域不会发生变化,不要因为被修饰变量自创建开始而直到程序结束才释放就将它想为它的作用域变长了,其实它的作用域并没有改变,只是它的生命周期变长了(存活时间久了)。

我这里插入两张代码运行截图更加便于直观的描述

下面是普通局部变量

下面是被static修饰的变量

static修饰局部变量总结(一般将定义在函数中的变量称为局部变量,其只能在函数内部使用):
1.生命周期延长:该变量不随函数结束而结束(说到周期这里就提一句变量的周期:一个变量从创建到销毁的那个时间段称为它的周期)。在这里引入生命周期这一概念,它分为局部变量的生命周期和全局变量的生命周期。局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束(可以理解为:在一个函数中定义的变量,从它被创建开始到它出了(销毁)这个函数的时间段就是它存活的生命周期)。
全局变量的生命周期:整个程序的生命周期,它随程序启动而 产生生,随程序结束而消亡,在任何函数中都可以使用。

2.从上面这两张运行结果能够发现被static修饰的局部变量a只在第一次调用时初始化。然后后序调用时,该变量使用前一次函数调用完成之后保存的值

3.被修饰后的局部变量不会存储在栈区,而是存储在静态区

当static修饰全局变量时,本来的全局变量是在整个程序都可以用,全局变量本身是具有外部链接使用属性,如在源文件A中定义的变量可以在源文件B中链接使用(编译器通过编译链接使用)。但是如果全局变量被static修饰后,这个外部链接属性就变成了内部链接属性,这个全局变量只能在它自己所在的源文件内部使用,从本质上讲,static修饰全局变量后,限制了全局变量的使用范围。static的修饰,会把外部链接属性变成内部链接属性使用,最终使全局变量的作用域变小了。

下面我们来看一下没有被static修饰的全局变量

 

 从上述运行结果不难看出,add.c这个源文件中data没有被static修饰时,是能被test.c这个源文件链接使用的。

下面我们来看被static修饰过的全局变量

 

 从上面运行结果可知,在add.c这个源文件中定义的变量data被static修饰后就不能被test.c这个源文件读取到(链接使用)

static修饰全局变量总结(定义在全局作用域中的变量,即函数外的变量):
     改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用,限制了全局变量的作用域

 

当static修饰函数:函数本身具有外部链接属性,原本两个源文件中包含的各个函数,可以被另一个源文件声明加以链接使用,这个static修饰函数和static修饰全局变量本质相似,如源文件A中的函数可以在源文件B中链接使用,static修饰函数后最终使源文件A中的函数只能在A中链接使用而不能被其他源文件链接使用(函数被static修饰后,外部链接属性就变成了内部链接属性,使得这一个函数只能在自己所在的源文件内部使用,其他源文件无法使用,限制了它的作用域);这里举一个例子:比如在日常生活中,我要用你的电脑,我给你说一声,然后我就可以用了,但是如果你不想我用了,你就对电脑加密,我就用不了了,而这里的static就相当于这个密码。

下面来看没有被修饰的函数

 

 从中可以看出test.c这个源文件可以链接使用Add.c这个源文件里定义的函数。

下面看一下函数被static修饰过后发生了怎样的变化

 

上面是被static修饰过的函数,从它这报错 内容是无法解析的外部符号Add在main中引用了该函数,由于源文件Add.c中定义的函数被static加以修饰过后,只能在它源文件本身内部链接使用,因此它这里才会出现无法解析的外部符号Add在main中引用了该符号这一错误。

static修饰函数总结: 改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用,域全局变量一样,也是被限制了作用域

以上是关于static这一关键字的理解,但是我想细心的你们也发现了,不管是在test.c中声明Add.c函数还是声明add..c全局变量时都用到了extern这一关键字,ertern是一个外部声明标识符,每个源文件都是单独编译的,当你想要用一个源文件时,就要对其进行声明,我们就用extern对外部内容进行声明,他是引用不再同一个源文件中的变量或者函数。这里浅谈一下就可,在后面会有详细文章对extern做出详细结束

以上就是对static的一些用法与总结啦,若有裨益,吾之幸也!若是了解了在评论区扣个1吧,谢谢支持。

美好的一天总是那么快就过去,我们不必感叹时间流逝,不必怀恋过去,也不必忧虑将来,我们唯一能掌控的也许只有我们现在能做什么。
————————————————
版权声明:本文为CSDN博主「top 00001」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_67768006/article/details/127607402

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值