sizeof(a) = 1個字節(jié)
sizeof(&a) = 4個字節(jié)
變量名存儲的地址栓袖,放在內(nèi)存中的哪里晤硕?
知道數(shù)據(jù)內(nèi)容和變量名是分開存儲
char 數(shù)據(jù)類型是占一字節(jié),所以:sizeof(a) = 1個字節(jié)
保存數(shù)據(jù)的內(nèi)存地址(對于 32 為系統(tǒng))是32位筛严,即 4 字節(jié)监徘,所以:sizeof(&a) = 4個字節(jié)變量名存儲的地址,是在棧中晨继。
</br>
要知道數(shù)據(jù)內(nèi)容和變量名是分開存儲:最好順便將堆、棧的概念弄清楚搬俊。
舉個例子紊扬,如:倉庫蜒茄,可以分為管理區(qū)和儲存區(qū),當然餐屎,管理區(qū)可以存放標識貨物保存在儲存區(qū)位置的標識牌檀葛,也可以保存貨物。
char a; 腹缩,相當于在管理區(qū)(棧)中的一個位置保存了一件貨物a屿聋,&a 相當于獲取這件貨物在管理區(qū)的位置(內(nèi)存地址)。當然藏鹊,管理區(qū)也要編號润讥。
char *pa相當于在管理區(qū)(棧)申請一個位置,用于存放貨物指示牌伙判。
pa = new char[100]象对,相當于在指示牌 pa 上標明這個貨物儲存區(qū)的位置黑忱。棧(內(nèi)存)是靜態(tài)的宴抚,編程時就確定,當然內(nèi)存釋放不用人工干預甫煞。堆(內(nèi)存)是動態(tài)的菇曲,在程序執(zhí)行是由你寫的代碼申請的,當然內(nèi)存釋放由你決定抚吠。
變量 a 的值在棧中常潮,變量 a 的內(nèi)存地址不保存(不占內(nèi)存空間),如果使用到 a 的內(nèi)存地址楷力,如:
int i = (int)(&a)喊式,那么,程序在編譯時將分配給 a 的內(nèi)存地址賦值給 i萧朝。
在棧中定義的變量岔留,其內(nèi)存地址是由編譯系統(tǒng)(靜態(tài))分配的,編譯系統(tǒng)預先知道這個地址检柬,沒有使用其他變量(在編譯過程中系統(tǒng)肯定使用臨時變量)保存這個地址献联,在訪問這個變量時,實際上是直接從這個內(nèi)存地址讀出數(shù)據(jù)何址。使用匯編語言術語來說里逆,指針相當于間接尋址方式,而直接定義的變量相當于直接尋址用爪。
在棧中定義的變量原押,這個申明變量的時候,是預先預留內(nèi)存地址偎血,需要申明使用的時候就去與這些預先內(nèi)存地址匹配在一起班眯,至于sizeof(&a)本質(zhì)上內(nèi)存地址不保存在內(nèi)存中希停,只是有著4個字節(jié)來臨時存儲這個內(nèi)存地址,變量所指向內(nèi)容的地址署隘,是之前就知道了