【C语言】static关键字的妙用

前言

在c/c++中存在着一种内存结构,以此为栈区、堆区、静态区(这里是大致划分,不细究)

存放规则如下:

栈区:存放局部变量、函数的形参、临时属性的变量

堆区:存放malloc、realloc、calloc、free等函数用于动态内存管理使用

静态区:存放全局变量、静态变量 

 

 一、static修饰局部变量

 我们试着运行以下代码,可以得知结果为1 1 1 1 1

 因为在函数test()的内部创建的 i 是具有临时属性的变量,其存放在内存的栈区,i 的作用域为函数test()的内部,生命周期为出作用域就结束,故每次进入test都会重新创建 i。

那如果我们用static修饰以下会发生什么呢?

 我们会发现,结果成了1 2 3 4 5,这是为什么呢?

这里我们就不得不说一下static关键字对局部变量的作用了,我们看一下它们对应的汇编代码

我们可以发现,经过static修饰的局部变量 i 的创建过程是没有经过汇编代码的,也就是说static使变量 i 加长了生命周期,注意:只是加长了生命周期,并没有扩大作用域

 二、static修饰全局变量

很明显,当我们把全局变量 i 定义在add.c文件中时,test.c文件中的 i 是无法被识别的,此时我们可以使用extern关键字, 它可以用来声明外部符号。

 这样就可以运行了,但当我们再使用static修饰全局变量 i 时,编译器再次报错:

 这是因为:C语言规定,全局变量具有外部连接属性,这种属性可以使全局变量在多个文件中互相使用,而static使全局变量的外部连接属性转变成了内部链接属性,即缩小了全局变量的作用域

三、static修饰函数 

static修饰函数与static修饰全局变量类似,函数在被引用之后是可以在其他文件中使用的,即也拥有外部连接属性,但被static修饰后,函数将被局限在自身所在文件中,不可被外部使用。

总结:static修饰局部变量可以改变局部变量的生命周期,不改变作用域,修饰全局变量和函数时均是改变的是链接属性,即可理解为锁在所在文件,不允许别的文件访问。

其实这样可以防止别人使用自己定义的变量。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值