解析C++各種變量及區(qū)別
在日常開發(fā)中,我們經(jīng)常使用變量,常量,像下面的代碼:
int ser_1; // 全局變量 const int ser_2; // 全局常量 static int ser_3; // 靜態(tài)變量 void main(){ int serven_1; // 局部變量 const int serven_2; // 局部常量 static int serven_3; // 局部靜態(tài)變量 func(serven_1); } void func(int para){ // 形參 int a; }
上面的一小段代碼涵蓋了變量、常量和靜態(tài)變量,并且均定義了全局和局部。這些是我們經(jīng)常使用到的定義變量的方式,但是你知道它們的區(qū)別嗎?它們的作用域又是什么?它們的在內(nèi)存中又是怎么樣存放的?
一、分類
變量可以分為:全局變量、局部變量、靜態(tài)全局變量、靜態(tài)局部變量;
在C++的內(nèi)存管理機(jī)制中,全局變量、靜態(tài)全局變量和靜態(tài)局部變量均存放在靜態(tài)存儲區(qū)域,局部變量存放在棧中,全局變量和靜態(tài)變量如果在定義的時(shí)候沒有初始化,那么編譯器會將這些變量初始化為0。
二、作用域
作用域表示一個變量在使用過程中的范圍,也就是在某個范圍內(nèi),變量可以正常使用,出了這個范圍,變量就失效了。
局部變量的作用域:局部變量的作用域在于函數(shù)體內(nèi)部,出了函數(shù)的范圍就是用不了了,像上述代碼中的serven_1變量,只能在main函數(shù)中使用,出了main函數(shù)就使用不了。形參變量屬于被調(diào)函數(shù)的局部變量,實(shí)參屬于主調(diào)函數(shù)的局部變量。不同的函數(shù)可以使用一模一樣的符號來定義變量,雖然符號一樣,但是它們實(shí)際上是不相同的。像下面的代碼,兩個函數(shù)的符號serven_1都不一樣,一個是int類型,一個是char類型。
void func_1(){ int serven_1 = 2; } void func_2(){ char serven_1 = 's'; }
全局變量的作用域:全局變量的作用域不屬于某一個函數(shù),它屬于一個源程序文件,作用域是整個源程序,當(dāng)需要在某個函數(shù)里面使用全局變量時(shí),需要做聲明,一般使用extern來做聲明。當(dāng)然啦,在同一個文件中就不需要做extern聲明。全局變量和局部變量可以用相同的符號來定義,在定義局部變量的函數(shù)體中,如果使用了該符號則認(rèn)為是局部變量,像下面的代碼中,在函數(shù)func中使用serven_1時(shí)用的是局部變量。
int serven_1; // 全局變量,未初始化時(shí)則編譯器默認(rèn)其為0 ? void func(){ int serven_1 = 3; std::cout<<serven_1<<std::endl; // 這里打印的是3 }
三、存儲區(qū)域
在C++的內(nèi)存管理機(jī)制中,將整個存儲區(qū)分為以下幾塊地方:代碼區(qū)域(CODE)、常量區(qū)域(TEXT)、BSS區(qū)域、DATA區(qū)域、堆(HEAP)、棧(STACK)。
- 棧(STACK):由編譯器進(jìn)行管理,自動分配和釋放,存放函數(shù)調(diào)用過程中的各種參數(shù)、局部變量、返回值以及函數(shù)返回地址。操作方式類似數(shù)據(jù)結(jié)構(gòu)中的棧。
- 堆(HEAP):用于程序動態(tài)申請分配和釋放空間。C語言中的malloc和free,C++中的new和delete均是在堆中進(jìn)行的。正常情況下,程序員申請的空間在使用結(jié)束后應(yīng)該釋放,若程序員沒有釋放空間,則程序結(jié)束時(shí)系統(tǒng)自動回收。注意:這里的“堆”并不是數(shù)據(jù)結(jié)構(gòu)中的“堆”。
- 全局(靜態(tài))存儲區(qū):分為DATA段和BSS段。DATA段(全局初始化區(qū))存放初始化的全局變量和靜態(tài)變量;BSS段(全局未初始化區(qū))存放未初始化的全局變量和靜態(tài)變量。程序運(yùn)行結(jié)束時(shí)自動釋放。其中BBS段在程序執(zhí)行之前會被系統(tǒng)自動清0,所以未初始化的全局變量和靜態(tài)變量在程序執(zhí)行之前已經(jīng)為0。
- 文字常量區(qū)(TEXT):存放常量字符串。程序結(jié)束后由系統(tǒng)釋放。
- 程序代碼區(qū)(CODE):存放程序的二進(jìn)制代碼。
在C/C++中,定義全局變量和局部變量時(shí)。全局變量(外部變量和靜態(tài)變量),均是保存在全局存儲區(qū)中,占用永久性的存儲單元;局部變量(自動變量),保存在棧中,只有在所在函數(shù)被調(diào)用時(shí)才由系統(tǒng)動態(tài)在棧中分配臨時(shí)性的存儲單元。
變量存儲區(qū)域分為動態(tài)存儲區(qū),靜態(tài)存儲區(qū),寄存器存儲區(qū);其中寄存器存儲也屬于動態(tài)分配。
靜態(tài)存儲變量通常是在變量定義時(shí)就分配存儲單元并一直保持不變, 直至整個程序結(jié)束;動態(tài)存儲變量是在程序執(zhí)行過程中,使用它時(shí)才分配存儲單元, 使用完畢立即釋放。
在C/C++語言中,對變量的存儲類型說明有以下四種:
auto:自動變量
register:寄存器變量(存儲在CPU寄存器中,寄存器運(yùn)算速度遠(yuǎn)高于內(nèi)存)
extern:外部變量
static:靜態(tài)變量
自動變量和寄存器變量屬于動態(tài)存儲方式, 外部變量和靜態(tài)變量屬于靜態(tài)存儲方式。在介紹了變量的存儲類型之后,可以知道對一個變量的說明不僅應(yīng)說明其數(shù)據(jù)類型,還應(yīng)說明其存儲類型。因此變量說明的完整形式應(yīng)為:
存儲類型說明符 數(shù)據(jù)類型說明符 變量名,變量名…;
例如:
static int ser_1,ser_2; // 說明ser_1,ser_2為靜態(tài)類型變量 auto char ser_3,ser_4; // 說明ser_3,ser_4為自動字符變量 static int ser_5[5]={1,1,1}; // 說明ser_5為靜整型數(shù)組 extern int ser_6, ser_7; // 說明ser_6, ser_7為外部整型變量。
自動型變量存放在堆棧區(qū)中。堆棧區(qū)也是內(nèi)存中一部分,該部分內(nèi)存在程序運(yùn)行中是重復(fù)使用的。堆區(qū)域一般是程序員我們自己來申請和釋放的,像malloc申請內(nèi)存;棧區(qū)域是編譯器自動來管理的,像調(diào)用函數(shù)的形參變量和局部變量。
四、總結(jié)
1、全局變量的作用域是全局的(整個程序的),該變量只需要在其中的一個源程序文件定義,在其他的源文件中如果要使用到,就在變量的前面加上外部聲明extern就可以使用了;
2、靜態(tài)全局變量的生命周期是整個程序,只要程序沒有停止,那么該變量都是占據(jù)著內(nèi)存空間,但是它的作用域僅限于當(dāng)前的源文件,這是它跟全局變量的區(qū)別就是全局變量在其他的源文件也是可以使用的;
3、靜態(tài)局部變量的生命周期是整個程序,只要程序沒有停止,那么該變量都是一直占據(jù)著內(nèi)存空間,但是它的作用域僅限于定義它的函數(shù)體中;
4、局部變量的作用域是局部的,它也是auto自動變量,當(dāng)函數(shù)執(zhí)行完成,該變量就會被撤銷,內(nèi)存也被收回,存儲在棧空間中;
5、為了降低模塊間的耦合度,一般會盡可能地使用靜態(tài)全局變量而不是全局變量;
6、為了降低模塊間的耦合度,一般會盡可能地使用靜態(tài)局部變量而不是靜態(tài)全局變量;
到此這篇關(guān)于解析C++各種變量及區(qū)別的文章就介紹到這了,更多相關(guān)C++各種變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析
這篇文章主要介紹了OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析,需要的朋友可以參考下2015-01-01C++ 關(guān)于MFC List Control 控件的總結(jié)
這篇文章主要介紹了C++ 關(guān)于MFC List Control 控件的總結(jié)的相關(guān)資料,十分的詳細(xì),有需要的朋友可以參考下2015-06-06c++中處理相關(guān)數(shù)學(xué)函數(shù)
數(shù)學(xué)庫函數(shù)聲明在 math.h 中,主要有:2013-04-04C語言鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)程序設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07