前言
在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修饰局部变量可以改变局部变量的生命周期,不改变作用域,修饰全局变量和函数时均是改变的是链接属性,即可理解为锁在所在文件,不允许别的文件访问。
其实这样可以防止别人使用自己定义的变量。