C語言變量生存期和作用域很簡單:除了生死,哪一樁不是閒事?

有道是這世間事,除了生死,哪一樁不是閒事?

變量死生事大,對於編程開發者樣樣都思量計劃周翔,唯獨對於變量生死之大事,反而置若罔聞,等到挑燈奮力苦戰,欲拯程序於一命呼呼之間,方捶胸頓足,一失足成千古恨。

人有了肉體就有了生命,變量分配了內存單元就有了存活,就有了壽夭長短的問題。它活著的時候就是有了內存空間的時候。當然如果你讓這個變量佔著茅坑不拉屎,就像皇帝永遠不去翻某個妃子的牌,那你絕對是個詩人,能寫出“有的人活著早就死了”的詩人。人死則灰飛煙滅,變量被回收了內存,那也就香消玉損,你也別想著有借屍還魂可能。從分配內存空間到回收空間就是變量的生存期。

人分三教九流,出入有別。有的人通天入地,有的人寸步難行。在程序的世界裡分有三界:不在任何函數內的extern叫天界,為什麼呢,因為生於此天的變量有著金剛不壞之身,有著跳出三界外不在五行中的本領,可以不受訪問通行限制我們叫全局變量,無何時何地我們都可以訪問他。另一個則是在函數內的我們叫地界,在這裡的變量招之即來,揮手則去,隨著函數的調用死死生生輪迴不休我們叫局部變量,每調一次函數變量就跟著來,完了則深藏功與名,坐脫立亡,瀟灑走一回。還有一些局部變量更加局部的,來得更匆匆,他們投胎到了複合語句裡面我們叫眾生界,生命在呼吸之間,出了複合語句的門它也就駕鶴西歸。另人欽佩的就是有著通天本領在函數地界裡手握免死牌static變量,只因他本是天界物卻被打入地界,所以有著不死之身,哪怕是函數已經輪迴千百劫,他卻自在逍遙,事來心應事去心止,不隨函數生滅,令人遺憾的是離開了函數你看不到他的存在。

生於天界的全局變量壽命是跟程序的壽命一樣的,他從程序運行那一刻起一直隨著程序到天荒地老,正所謂與天同壽。無論是在哪你都看到他的存在,也可訪問他。而那些局部變量只能活在複合語句與函數之內,複合語句函數調用完了,分配給他的內存空間也就被充公釋放重複利用,所以也就死了,再來一次,又得重新分配內存,名雖不變身已不同,你不可能讀得他前世的記憶,當然static變量可是神識不滅,你可以讀取他上次來的記憶。

同在天界的全局變量名是不可重名的,都要獨一無二,為什麼不行呢,想想變量名相當於內存地址,怎麼能有同一身體的兩個人不同呢?地界裡的變量名跟天界的重名是沒有問題的,因為地界的變量是生在不同的地方進入函數他才存在,離開了就沒有了,雖然與全局變量名相同但是他的內存地址是不同的,你會不會問那在函數里訪問與全局變量同名的局部變量,我訪問的是哪一個呢?當然是屬於你自己的那個局部變量了,你沒得選擇編譯器幫你選了。不同函數的變量名也是可以重名的,包過static,原因只有一個所屬的函數主人不同,內存地址不同。

變量生存期與作用域與他的出生地息息相關,生在大的地方,作用域也就廣,反之同理,

總之記住變量生於何地用於何地。

附變量生存期和作用域分界圖

C語言變量生存期和作用域很簡單:除了生死,哪一樁不是閒事?

圖中每個變量離開自己的範圍便無法訪問


分享到:


相關文章: