tip.以下static仅为鄙人一点认知,希望各位能给提出宝贵的意见!
在引入static之前,我们先来看一看c语言中的存储空间:
(这些在后面会被用到)
static可用来修饰:
1.局部变量
2.全局变量
3.函数
1.局部变量
我们先来看一看没有static修饰时的函数:
运行结果:
很明显,十个1,因为a为局部变量被存在了栈区。使用完一次后被销毁,之后再进入test函数时,又重新创建变量a,如此循环10次,运行10次test函数,于是就出现了10次1.
当我们用static修饰局部变量a时:
运行结果:
我们可以看到,1-10被打印了出来。
这是因为static将变量a从局部变量变成了静态变量,将a存储到了静态区,与全局变量有了相似的特征。我们知道全局变量的生命周期是伴随一整个工程的。所以在test函数执行完一遍后a不会被销毁,在下次调用时仍维持上次的值。
2.全局变量
仍然先看不被static修饰时的情况:
创建两个源文件,一个创建全局变量,一个使用全局变量。
在另一个源文件引用全局变量时要用extern声明一下。
运行结果:
全局变量a成功被引用。
当用static修饰时:
结果为:
a无法被引用。
一个全局变量 在整个工程的其他文件内部能被使用,是因为全局变量具有外部链接的属性,而当一个全局变量被stati修饰时,这个全局变量的外部链接属性就变成了内部链接属性,使得这个全局变量只能在自己所在的源文件使用,其他文件不能再被使用。static修饰全局变量,让其外部链接属性变成了内部链接熟悉,从而使它的作用域变小了,而其生命周期不变。
3.函数
static修饰函数与修饰全局变量作用相似。同样,我们先来看没有static修饰时:
运行结果:
使用外部函数成功;
当我们用static修饰时:
和static修饰全局变量道理一样,
函数本来也是具有外部链接属性的,被static修饰的时候就变成了内部链接属性,这个函数只能在自己所在的源文件内部使用,不能再其他文件使用。
总结:
1.当static修饰局部变量时,该变量被存到了静态区,因此其值在下次调用时仍维持上次的值;
2.修饰全局变量时,在本文件内的static全局变量内可以被模块内所用函数访问,但不能被模块外其它文件内的函数访问;
3.修饰函数时与修饰全局变量相同。只能在该文件内被调用,不能被外部文件调用。
感觉有用的老铁点个赞和关注再走啊!谢谢各位。