{
int b = 0;
}
定义在函数参数列表或者内部被称作局部变量,例如变量a和变量b。而定义在函数外部变量global则被称为全局变量。
这二者有什么分别呢?
最大的分别自然就是作用域不同,还有就是生命周期不同。作用域咱么就不多讲了,现在来说说生命周期。
局部变量的一生是这样度过的:当调用函数的时候执行它们的声明语句,这时它们就出生了。然后等到函数执行完,它们就会被无情的杀死。
全局变量就不一样了,它在程序开始执行时就出生了,要等到整个程序运行结束的时候才是死亡,可以说是与天地同寿。
也就是说,全局变量会一直占用这内存不释放。因此,我们在声明一个变量时一定要考虑它的作用域,应该在实现功能的情况下尽量让其作用域更小,让其脱离作用域后就释放,提高内存的使用效率。」
「那这么说来局部变量很可怜,一辈子兢兢业业,任劳任怨,存活的时间还那么短暂。」
我感叹道。
「谁说不是呢,局部变量就像是你老爹我这样的为了生活在社会底层屌丝,一辈子任劳任怨,却又碌碌无为。」
可能是我的话戳中了老爹心中的软肋,他一下子变得有些伤感。
「当然了,屌丝也有成功逆袭的时候,所以希望还是要有的嘛。」
原本还想安慰一下老爹,没有到他瞬间又恢复了原来的模样。
「说到这里,咱们就来说说如何让可怜而又短命的局部变量成功逆袭,踏上与与天地同寿的人生巅峰。」
老爹突然有让人振奋的声音说道。
「……」
我有点无语,感情他刚刚一幅伤感、心酸的模样就是为了渲染气氛。
「在关键字中有一个叫做static的关键,它有两个作用,其中一个作用就是可以让局部变量逆天改命,让它具备与天地同寿的能力。
void uncF(void)
{
static int c = 0;
}
它的用法就是这样,在函数内部声明一个局部变量的时候用static修饰它,这样它就可以与天地同寿了。
除此之外,人生轨迹也发生了变化。
如果没有static修饰变量c,每次调用uncF()的时候都会执行int = 0这句,然后函数调用完了,它就被杀死了。
但是现在它被static逆天改命了,情况就变得不同了。首先,只有在第一次调用函数uncF()的时候才会执行int c = 0。其次,在uncF()执行结束后,它也不会再被杀死。
等到下一次在执行uncF()的时候,c还保持着上一次的状态。」
诚如老爹所言,我和小弦子写代码验证了一下,结果和老爹的说法完全一致。
「那static是如何做到为一个变量逆天改命的呢?我看动漫里边逆天改命都要付出很大的代价。」
我也想问这个问题,没有想到让小弦子给领先了。
「这个就涉及到内存分区了。
先前已经跟你们说了,程序要运行需要先被加载到内存中去,这个加载也不是随便加载的。
运行程序的内存被分成了五个区,它们分别是:代码区、常量区、全局数据区、堆区、栈区。」