全局變量
定義:在函數(shù)外定義的變量是全局變量,全局變量可以為本文件中其它函數(shù)所共用,它的有效范圍從定義變量的位置開始到本源文件結(jié)束。
- 設(shè)全局變量的作用:增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道;
- 不必要時不要使用全局變量,因?yàn)椋篴) 全局變量在程序的全部執(zhí)行過程中都占用存儲單元; b) 使得函數(shù)的通用性降低;c) 全局變量使用過多,會降低程序的清晰性;
- 如果外部變量在文件開頭定義,則在整個文件范圍內(nèi)都可以使用該外部變量,如果不在文件開頭定義,按上面規(guī)定作用范圍只限于定義點(diǎn)到文件終了,如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在該函數(shù)中用關(guān)鍵字extern作外部變量說明;
- 如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量不起作用。
局部變量
定義: 在一個函數(shù)內(nèi)部定義的變量是局部變量,它只在本函數(shù)范圍內(nèi)有效。
- 主函數(shù)main定義的變量也只在主函數(shù)有效;
- 不同函數(shù)中可以使用名字相同的變量,它們代表不同的對象,互不干擾;
- 形式參數(shù)也是局部變量;
- 在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效。
靜態(tài)變量
變量定義前加上 static
- 靜態(tài)變量的作用范圍要看靜態(tài)變量的位置,如果在函數(shù)里,則就是靜態(tài)局部變量,作用范圍就是這個函數(shù);
- 靜態(tài)全局變量,只在本文件可以用,雖然整個程序包含多個文件, 但靜態(tài)全局變量只能用在定義它的那個文件里,卻不能用在程序中的其他文件里。它是定義存儲因型為靜態(tài)型的外部變量,其作用域是從定義點(diǎn)到程序結(jié)束,所不同的是存儲類型決定了存儲地點(diǎn),靜態(tài)型變量是存放在內(nèi)存的數(shù)據(jù)區(qū)中的, 它們在程序開始運(yùn)行前就分配了固定的字節(jié), 在程序運(yùn)行過程中被分配的字節(jié)大小是不改變的,只有程序運(yùn)行結(jié)束后,才釋放所占用的內(nèi)存。
思考
1、static全局變量與普通的全局變量有什么區(qū)別?
- 全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。這兩者在存儲方式上并無不同。
- 這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個源程序,當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯誤。
- 從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。
2、static函數(shù)與普通函數(shù)有什么區(qū)別?
- static函數(shù)與普通函數(shù)作用域不同,僅在本文件。
- 只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說明和定義。
- 對于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件。
3、static局部變量和普通局部變量有什么區(qū)別?
- static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值。
總結(jié)
- 全局變量的作用域是整個項(xiàng)目,它只需要在一個源文件中定義就可以作用于所有的源文件,其它不包括全局變量定義的文件需要用extern關(guān)鍵字再次聲明這個全局變量。
- 全局變量、靜態(tài)全局變量、靜態(tài)局部變量都是在靜態(tài)存儲區(qū)(全局?jǐn)?shù)據(jù)區(qū))中分配空間的,而局部變量是在棧上分配空間的。
- 全局變量、靜態(tài)變量的生命期和程序生命期是一樣的,在程序結(jié)束之后操作系統(tǒng)會回收空間。
- 全局變量和靜態(tài)變量都是保存在靜態(tài)存儲區(qū)中,生命期和程序一樣,但是不同的是全局變量的作用域是整個項(xiàng)目,而靜態(tài)全局變量是當(dāng)前程序文件,靜態(tài)局部變量則是當(dāng)前函數(shù)體內(nèi)。全局變量和靜態(tài)全局變量、靜態(tài)局部變量默認(rèn)值都是0,也就是在沒有初始化變量值的時候默認(rèn)為0。
- 靜態(tài)變量包含靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量具有局部作用域只對定義自己的函數(shù)可見,只被初始化一次,自從初始化一次之后直到程序運(yùn)行期間一直都在。靜態(tài)全局變量具有全局作用域作用于定義它的程序文件但是不能作用于項(xiàng)目里的其它文件,這一點(diǎn)和全局變量不同。靜態(tài)全局變量可以被多次初始化。
- 把局部變量改變?yōu)殪o態(tài)變量之后是改變了它的存儲方式和生命期。把全局變量改變?yōu)殪o態(tài)變量之后是改變了它的作用域,限制了使用范圍。
C/C++語言經(jīng)過編譯之后將內(nèi)存分為以下幾個區(qū)域:
- 棧(stack)區(qū):由編譯器進(jìn)行管理,自動分配和釋放,存放函數(shù)調(diào)用過程中的各種參數(shù)、局部變量、局部常量、返回值以及函數(shù)返回地址。操作方式類似數(shù)據(jù)結(jié)構(gòu)中的棧。
- 堆(heap)區(qū):用于程序動態(tài)申請分配和釋放空間。C語言中的malloc和free,C++中的new和delete均是在堆中進(jìn)行的。正常情況下,程序員申請的空間在使用結(jié)束后應(yīng)該釋放,若程序員沒有釋放空間,則程序結(jié)束時系統(tǒng)自動回收。注意:這里的“堆”并不是數(shù)據(jù)結(jié)構(gòu)中的“堆”。
普通變量和局部變量存放在棧里,指針變量存放在堆里。
- 全局(靜態(tài))存儲區(qū)、全局區(qū):分為DATA段和BSS段。DATA段(全局初始化區(qū))存放初始化的全局變量和靜態(tài)變量;BSS段(全局未初始化區(qū))存放未初始化的全局變量和靜態(tài)變量。還存放了常量(字符串常量、其他常量等)。程序運(yùn)行結(jié)束時自動釋放。其中BBS段在程序執(zhí)行之前會被系統(tǒng)自動清0,所以未初始化的全局變量和靜態(tài)變量在程序執(zhí)行之前已經(jīng)為0。
- 程序代碼區(qū)、代碼區(qū):存放程序的二進(jìn)制代碼。
顯然,C/C++語言中的全局變量和局部變量在內(nèi)存中是有區(qū)別的。C/C++語言中的全局變量包括外部變量和靜態(tài)變量,均是保存在全局存儲區(qū)中,占用永久性的存儲單元;局部變量,即自動變量,保存在棧中,只有在所在函數(shù)被調(diào)用時才由系統(tǒng)動態(tài)在棧中分配臨時性的存儲單元。文章來源:http://www.zghlxwxcb.cn/news/detail-735716.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-735716.html
到了這里,關(guān)于全局變量、局部變量和靜態(tài)變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!