




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第解析C++各種變量及區(qū)別目錄一、分類二、作用域三、存儲(chǔ)區(qū)域四、總結(jié)在日常開(kāi)發(fā)中,我們經(jīng)常使用變量,常量,像下面的代碼:
intser_1;//全局變量
constintser_2;//全局常量
staticintser_3;//靜態(tài)變量
voidmain(){
intserven_1;//局部變量
constintserven_2;//局部常量
staticintserven_3;//局部靜態(tài)變量
func(serven_1);
voidfunc(intpara){//形參
inta;
}
上面的一小段代碼涵蓋了變量、常量和靜態(tài)變量,并且均定義了全局和局部。這些是我們經(jīng)常使用到的定義變量的方式,但是你知道它們的區(qū)別嗎?它們的作用域又是什么?它們的在內(nèi)存中又是怎么樣存放的?
一、分類
變量可以分為:全局變量、局部變量、靜態(tài)全局變量、靜態(tài)局部變量;
在C++的內(nèi)存管理機(jī)制中,全局變量、靜態(tài)全局變量和靜態(tài)局部變量均存放在靜態(tài)存儲(chǔ)區(qū)域,局部變量存放在棧中,全局變量和靜態(tài)變量如果在定義的時(shí)候沒(méi)有初始化,那么編譯器會(huì)將這些變量初始化為0。
二、作用域
作用域表示一個(gè)變量在使用過(guò)程中的范圍,也就是在某個(gè)范圍內(nèi),變量可以正常使用,出了這個(gè)范圍,變量就失效了。
局部變量的作用域:局部變量的作用域在于函數(shù)體內(nèi)部,出了函數(shù)的范圍就是用不了了,像上述代碼中的serven_1變量,只能在main函數(shù)中使用,出了main函數(shù)就使用不了。形參變量屬于被調(diào)函數(shù)的局部變量,實(shí)參屬于主調(diào)函數(shù)的局部變量。不同的函數(shù)可以使用一模一樣的符號(hào)來(lái)定義變量,雖然符號(hào)一樣,但是它們實(shí)際上是不相同的。像下面的代碼,兩個(gè)函數(shù)的符號(hào)serven_1都不一樣,一個(gè)是int類型,一個(gè)是char類型。
voidfunc_1(){
intserven_1=2;
voidfunc_2(){
charserven_1='s';
}
全局變量的作用域:全局變量的作用域不屬于某一個(gè)函數(shù),它屬于一個(gè)源程序文件,作用域是整個(gè)源程序,當(dāng)需要在某個(gè)函數(shù)里面使用全局變量時(shí),需要做聲明,一般使用extern來(lái)做聲明。當(dāng)然啦,在同一個(gè)文件中就不需要做extern聲明。全局變量和局部變量可以用相同的符號(hào)來(lái)定義,在定義局部變量的函數(shù)體中,如果使用了該符號(hào)則認(rèn)為是局部變量,像下面的代碼中,在函數(shù)func中使用serven_1時(shí)用的是局部變量。
intserven_1;//全局變量,未初始化時(shí)則編譯器默認(rèn)其為0
voidfunc(){
intserven_1=3;
std::coutserven_1std::endl;//這里打印的是3
}
三、存儲(chǔ)區(qū)域
在C++的內(nèi)存管理機(jī)制中,將整個(gè)存儲(chǔ)區(qū)分為以下幾塊地方:代碼區(qū)域(CODE)、常量區(qū)域(TEXT)、BSS區(qū)域、DATA區(qū)域、堆(HEAP)、棧(STACK)。
棧(STACK):由編譯器進(jìn)行管理,自動(dòng)分配和釋放,存放函數(shù)調(diào)用過(guò)程中的各種參數(shù)、局部變量、返回值以及函數(shù)返回地址。操作方式類似數(shù)據(jù)結(jié)構(gòu)中的棧。堆(HEAP):用于程序動(dòng)態(tài)申請(qǐng)分配和釋放空間。C語(yǔ)言中的malloc和free,C++中的new和delete均是在堆中進(jìn)行的。正常情況下,程序員申請(qǐng)的空間在使用結(jié)束后應(yīng)該釋放,若程序員沒(méi)有釋放空間,則程序結(jié)束時(shí)系統(tǒng)自動(dòng)回收。注意:這里的堆并不是數(shù)據(jù)結(jié)構(gòu)中的堆。全局(靜態(tài))存儲(chǔ)區(qū):分為DATA段和BSS段。DATA段(全局初始化區(qū))存放初始化的全局變量和靜態(tài)變量;BSS段(全局未初始化區(qū))存放未初始化的全局變量和靜態(tài)變量。程序運(yùn)行結(jié)束時(shí)自動(dòng)釋放。其中BBS段在程序執(zhí)行之前會(huì)被系統(tǒng)自動(dòng)清0,所以未初始化的全局變量和靜態(tài)變量在程序執(zhí)行之前已經(jīng)為0。文字常量區(qū)(TEXT):存放常量字符串。程序結(jié)束后由系統(tǒng)釋放。程序代碼區(qū)(CODE):存放程序的二進(jìn)制代碼。
在C/C++中,定義全局變量和局部變量時(shí)。全局變量(外部變量和靜態(tài)變量),均是保存在全局存儲(chǔ)區(qū)中,占用永久性的存儲(chǔ)單元;局部變量(自動(dòng)變量),保存在棧中,只有在所在函數(shù)被調(diào)用時(shí)才由系統(tǒng)動(dòng)態(tài)在棧中分配臨時(shí)性的存儲(chǔ)單元。
變量存儲(chǔ)區(qū)域分為動(dòng)態(tài)存儲(chǔ)區(qū),靜態(tài)存儲(chǔ)區(qū),寄存器存儲(chǔ)區(qū);其中寄存器存儲(chǔ)也屬于動(dòng)態(tài)分配。
靜態(tài)存儲(chǔ)變量通常是在變量定義時(shí)就分配存儲(chǔ)單元并一直保持不變,直至整個(gè)程序結(jié)束;動(dòng)態(tài)存儲(chǔ)變量是在程序執(zhí)行過(guò)程中,使用它時(shí)才分配存儲(chǔ)單元,使用完畢立即釋放。
在C/C++語(yǔ)言中,對(duì)變量的存儲(chǔ)類型說(shuō)明有以下四種:
auto:自動(dòng)變量
register:寄存器變量(存儲(chǔ)在CPU寄存器中,寄存器運(yùn)算速度遠(yuǎn)高于內(nèi)存)
extern:外部變量
static:靜態(tài)變量
自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)變量屬于靜態(tài)存儲(chǔ)方式。在介紹了變量的存儲(chǔ)類型之后,可以知道對(duì)一個(gè)變量的說(shuō)明不僅應(yīng)說(shuō)明其數(shù)據(jù)類型,還應(yīng)說(shuō)明其存儲(chǔ)類型。因此變量說(shuō)明的完整形式應(yīng)為:
存儲(chǔ)類型說(shuō)明符數(shù)據(jù)類型說(shuō)明符變量名,變量名;
例如:
staticintser_1,ser_2;//說(shuō)明ser_1,ser_2為靜態(tài)類型變量
autocharser_3,ser_4;//說(shuō)明ser_3,ser_4為自動(dòng)字符變量
staticintser_5[5]={1,1,1};//說(shuō)明ser_5為靜整型數(shù)組
externintser_6,ser_7;//說(shuō)明ser_6,ser_7為外部整型變量。
自動(dòng)型變量存放在堆棧區(qū)中。堆棧區(qū)也是內(nèi)存中一部分,該部分內(nèi)存在程序運(yùn)行中是重復(fù)使用的。堆區(qū)域一般是程序員我們自己來(lái)申請(qǐng)和釋放的,像malloc申請(qǐng)內(nèi)存;棧區(qū)域是編譯器自動(dòng)來(lái)管理的,像調(diào)用函數(shù)的形參變量和局部變量。
四、總結(jié)
1、全局變量的作用域是全局的(整個(gè)程序的),該變量只需要在其中的一個(gè)源程序文件定義,在其他的源文件中如果要使用到,就在變量的前面加上外部聲明extern就可以使用了;
2、靜態(tài)全局變量的生命周期是整個(gè)程序,只要程序沒(méi)有停止,那么該變量都是占據(jù)著內(nèi)存空間,但是它的作用域僅限于當(dāng)前的源文件,這是它跟全局變量的區(qū)別就是全局變量在其他的源文件也是可以使用的;
3、靜態(tài)局部變量的生命周期是整個(gè)程序,只要程序沒(méi)有停止,那么該變量都是一直占據(jù)著內(nèi)存空間,但是它的作用域僅限于定義它的函數(shù)體中;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 主動(dòng)出擊2025年ACCESS考試試題及答案
- JAVA中的內(nèi)存模型考點(diǎn)試題及答案
- 互聯(lián)網(wǎng)資源利用ACCESS試題及答案
- C語(yǔ)言程序設(shè)計(jì)中的常見(jiàn)問(wèn)題與解決思路試題及答案
- 二級(jí)C語(yǔ)言常用技巧總結(jié)試題及答案
- 風(fēng)格獨(dú)特現(xiàn)代漢語(yǔ)考試試題及答案
- 2025股權(quán)投資合同協(xié)議書模板
- 跨界合作藝術(shù)作品版權(quán)歸屬合作協(xié)議
- 網(wǎng)絡(luò)購(gòu)物平臺(tái)客服人員綜合培訓(xùn)及考核協(xié)議
- 外商投資稅款擔(dān)保補(bǔ)充協(xié)議
- 餐廳水單萬(wàn)能模板-可打印
- 中國(guó)城市中英文對(duì)照
- 作業(yè)治療學(xué)題庫(kù)第七章
- 醫(yī)學(xué)信息檢索與利用智慧樹(shù)知到答案章節(jié)測(cè)試2023年杭州醫(yī)學(xué)院
- 并網(wǎng)前設(shè)備電氣試驗(yàn)、繼電保護(hù)整定、通訊聯(lián)調(diào)
- 用表格為網(wǎng)頁(yè)布局教學(xué)設(shè)計(jì)
- 病原微生物實(shí)驗(yàn)室生物安全管理手冊(cè)
- 上消化道出血病人的觀察與護(hù)理-課件
- 光纜測(cè)試報(bào)告
- 初中物理教育科學(xué)八年級(jí)下冊(cè)第十一章 機(jī)械與功《功》教學(xué)設(shè)計(jì)
- 神經(jīng)病學(xué)人衛(wèi)版習(xí)題集題庫(kù)
評(píng)論
0/150
提交評(píng)論