關(guān)于局部變量链韭、全局變量與靜態(tài)全局變量和靜態(tài)局部變量的比較與分析和拓展:
首先要明白的是局部變量與其它三個(gè)有本質(zhì)區(qū)別。
局部變量煮落,定義在函數(shù)內(nèi)敞峭,作用域?yàn)槎x位置,到所在大括號(hào)結(jié)束蝉仇。 每次執(zhí)行到定義語句的時(shí)候旋讹,系統(tǒng)為該變量分配內(nèi)存,當(dāng)作用域結(jié)束后量淌,內(nèi)存被釋放骗村。
而另外三個(gè)嫌褪,都是在系統(tǒng)運(yùn)行時(shí)就分配內(nèi)存呀枢,在運(yùn)行過程中都不會(huì)釋放,直到程序結(jié)束笼痛。
也就是說裙秋,局部變量和其它三個(gè)琅拌,最明顯的區(qū)別:
1 生命周期不同
2 分配時(shí)間不同
3 分配位置不同。
而另外三個(gè)摘刑,在這幾項(xiàng)上是相同的进宝,之間的區(qū)別在于作用域。
全局變量枷恕,作用域?yàn)檎麄€(gè)項(xiàng)目党晋,不管在哪個(gè)文件中,只要聲明后都可以使用徐块,當(dāng)然未玻,其他不包含全局變量定義的源文件需要用extern 關(guān)鍵字再次聲明這個(gè)全局變量。
靜態(tài)全局變量也具有全局作用域胡控,他與全局變量的區(qū)別在于如果程序包含多個(gè)文件的話扳剿,他作用于定義它的文件里,不能作用到其他文件里昼激,即被static關(guān)鍵字修飾過的變量具有文件作用域庇绽。這樣即使兩個(gè)不同的源文件都定義了相同的靜態(tài)全局變量,他們也是不同的變量橙困。
而靜態(tài)局部變量瞧掺,作用域與普通局部變量一樣,都是定義位置到所在大括號(hào)結(jié)束凡傅。靜態(tài)局部變量具有局部作用域夸盟,它只被初始化一次,自從第一次被初始化直到程序運(yùn)行結(jié)束都一直存在像捶,他和全局變量的區(qū)別在于全局變量對(duì)所有的函數(shù)都是可見的上陕,而靜態(tài)局部變量只對(duì)定義自己的函數(shù)體始終可見。
需要注意的是:
1>全局變量拓春,靜態(tài)局部變量释簿,靜態(tài)全局變量都在靜態(tài)存儲(chǔ)區(qū)分配空間,而局部變量在棧里分配空間硼莽。
2>全局變量本身就是靜態(tài)存儲(chǔ)方式庶溶, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無不同懂鸵。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序偏螺,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的匆光。而靜態(tài)全局變量則限制了其作用域套像,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它终息。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi)夺巩,只能為該源文件內(nèi)的函數(shù)公用贞让,因此可以避免在其它源文件中引起錯(cuò)誤。
注釋:static修飾局部變量說明
1)靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)分配存儲(chǔ)單元柳譬。 在程序整個(gè)運(yùn)行期間都不釋放喳张。自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用之后即 釋放。
2)對(duì)靜態(tài)局部變量,是在編譯時(shí)候賦初值的,即只付出至一次,在程序運(yùn)行時(shí)它已由初值美澳。以 后每次調(diào)用的時(shí)候不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值销部。而對(duì)自動(dòng)變量賦初值,不是在編譯的時(shí)候進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行。每調(diào)用一次函數(shù),重新給一個(gè)初值制跟。 相當(dāng)于執(zhí)行一次賦值語句柴墩。靜態(tài)變量會(huì)被放在程序的靜態(tài)數(shù)據(jù)存儲(chǔ)區(qū)里,這樣可以在下一次調(diào)用的時(shí)候還可以保持原來的賦值凫岖。這一點(diǎn)是他與堆棧變量和堆變量的區(qū)別
3)如在定義局部變量時(shí)不賦初值的話,則編譯器對(duì)靜態(tài)變量默認(rèn)賦值為0(整型)或者空字符(字符型) ,對(duì)動(dòng)態(tài)變量只分配內(nèi)存空間,并不會(huì)賦默認(rèn)值,所以里面的值是隨機(jī)的江咳。
4)靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束之后仍然是存在的,但是作用域不變,其他函數(shù)依然不能引用。
關(guān)于static功能的拓展:
1.static與 extern對(duì)函數(shù)的作用:
函數(shù)的本質(zhì)是全局的,寫函數(shù)就是用來調(diào)用的,但是有些時(shí)候不想讓其他文件訪問指定函數(shù)哥放。
根據(jù)函數(shù)能否被其他文件調(diào)用,將函數(shù)分為了內(nèi)部函數(shù)和外部函數(shù)歼指。
內(nèi)部函數(shù):只能被本文件中其他函數(shù)所調(diào)用,成為內(nèi)部函數(shù)。在定義函數(shù)的時(shí)候使用static修飾就可以了甥雕。
外部函數(shù):能被其他文件訪問,定義的時(shí)候在最左邊加關(guān)鍵字extern顯示表示為外部函數(shù),不加則表示隱含的extern踩身。
2.函數(shù)中必須要使用static變量的情況:當(dāng)某函數(shù)的返回值為指針類型時(shí),則必須是static的局部變量的地址作為返回值社露,若為auto類型(參考//注釋:)挟阻,則返回為其指針。局部變量在函數(shù)調(diào)用后就銷毀了峭弟,雖然地址還在附鸽,但是那個(gè)地址存的數(shù)據(jù)是無法保證安全性的,因此如果想指向被調(diào)函數(shù)中的參數(shù)瞒瘸,最好將其定義為靜態(tài)的~
//注釋:
auto在函數(shù)中的局部變量,如果不專門聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中坷备。函數(shù)中的形參和函數(shù)中的變量都是這種類型的。在調(diào)用該函數(shù)的時(shí)候系統(tǒng)會(huì)給分配內(nèi)存空間,函數(shù)調(diào)用完畢之后,自動(dòng)釋放這些存儲(chǔ)空間情臭。因此這類局部變量稱為自動(dòng)變量省撑。
函數(shù)中,定義auto int a = 10,跟int a = 10等價(jià)Register
關(guān)鍵字regiter請(qǐng)求編譯器盡可能的將變量存在CPU的寄存器中。有以下幾點(diǎn)注意的地方俯在。
register變量必須是能被CPU寄存器所接受的類型,這通常意味著register變量必須是一個(gè)單個(gè)的值,并且其長度應(yīng)小于或等于整型的長度竟秫。但是,有些機(jī)器的寄存器也能存放浮點(diǎn)數(shù)。
register變量可能不存放在內(nèi)存中,所以不能用取址符運(yùn)算符“& ”跷乐。 只有局部變量和形參可以作為register變量,全局變量不行肥败。 靜態(tài)變量不能定義為register。