由x=y;引發(fā)的思考_第1頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、由x=y;引發(fā)的思考容易而言,浮現(xiàn)在賦值符 = 右邊的就是右值,浮現(xiàn)在賦值符 = 左邊的就是左值。 左值:在這個(gè)上下文環(huán)境中,編譯器認(rèn)為x 的含義是x 所代表的地址。這個(gè)地址惟獨(dú)編譯器知道,在編譯的時(shí)候確定,編譯器在一個(gè)特定的區(qū)域保存這個(gè)地址,我們徹低不必考慮這個(gè)地址保存在哪里。 右值:在這個(gè)上下文環(huán)境中,編譯器認(rèn)為y 的含義是y 所代表的地址里面的內(nèi)容。這個(gè)內(nèi)容是什么,惟獨(dú)到運(yùn)行時(shí)才知道。 那你畢竟知道x,y代表什么了嗎? 這就要說(shuō)到變量的含義,變量是對(duì)于編譯階段的特有屬性,下面來(lái)認(rèn)真分析一下變量。 變量:用來(lái)標(biāo)識(shí)(entify)一塊內(nèi)存區(qū)域,這塊區(qū)域的值普通是可以更改的,這就是它 變 的由

2、來(lái),但是我們可以通過(guò)用法如const等一些修飾符號(hào)來(lái)限定這一內(nèi)存區(qū)域的操作特性(characteristic),即變量的操作特性。用const修飾的使變量不能更改的就和常量一樣的變量叫做常變量。 變量名:是一個(gè)標(biāo)識(shí)符(identifier),用來(lái)指代一塊內(nèi)存區(qū)域,即變量,用法變量使我們操作內(nèi)存以區(qū)域(area),以塊(block)為單位,提高了便利性。 你的機(jī)器代碼中,是不會(huì)浮現(xiàn)變量名的;變量名是給我們程序員操作內(nèi)存來(lái)用法的。 想想在匯編年月,沒(méi)有變量名,我們操作內(nèi)存,都是用地址來(lái)挺直操作的,還要控制區(qū)域大??;固然匯編語(yǔ)言已經(jīng)有了容易的變量。 對(duì)于編譯器,它會(huì)搜集我們的變量名,比如我們定義了一

3、個(gè)全局的int a;那么編譯器都為我們做了什么呢? 它會(huì)為程序預(yù)留4個(gè)字節(jié)的空間(假設(shè)在32位平臺(tái)),并把我們的變量名 a 保存進(jìn)符號(hào)表,并用這個(gè)符號(hào)表的索引對(duì)應(yīng)實(shí)際的空間。 假如下面浮現(xiàn)b = a;那么它就會(huì)按照符號(hào)表找到變量的真正的物理位置,取得它的值,賦給b。 這是寫編譯器需要做的,我們需要建立符號(hào)表。 但是實(shí)際在匯編層次上,操作的都是地址而已,不存在任何名稱了。 除了變量名不是內(nèi)存地址,其他名都是地址。對(duì)么? 所謂的其他名無(wú)非是函數(shù)名、標(biāo)識(shí)符常量名、指針名、數(shù)組名、結(jié)構(gòu)名、類名等等。 比如指針名、數(shù)組名、函數(shù)名就是地址,它們分離表示指針?biāo)赶蛟氐牡刂?、?shù)組的首地址和函數(shù)的入口地址。

4、變量名雖然不挺直表示地址,但可用取地址符號(hào) 來(lái)獲得它所代表的變量的存放地址。由于在定義變量的同時(shí)會(huì)分配給它相應(yīng)的空間。 但類和結(jié)構(gòu)惟獨(dú)事例化時(shí)才為它分配空間,從而不能用取地址符號(hào) 來(lái)獲得類名或結(jié)構(gòu)名的地址。 變量名是用來(lái)標(biāo)識(shí)某個(gè)內(nèi)存塊的 地址就是地址啦,如是變量名的話,用取地址運(yùn)算符 就可以得到它標(biāo)識(shí)的內(nèi)存塊的地址, 而指針變量呢,它本身也是一個(gè)變量名,只不過(guò)它標(biāo)識(shí)的那塊內(nèi)存存放的是一個(gè)地址值 變量是地址的別號(hào).就像剛生的小孩,你只知道他在地球上的某個(gè)位置,而不能叫出他名字,給你取個(gè)名 定義int a;時(shí),編譯器分配4個(gè)字節(jié)內(nèi)存,并命名該4個(gè)字節(jié)的空間名字為a(即變量名),當(dāng)用到變量名a時(shí),就

5、是在用法那4個(gè)字節(jié)的內(nèi)存空間. 5是一個(gè)常數(shù),在程序編譯時(shí)存放在代碼的常量區(qū)存放著它的值(就是5),當(dāng)執(zhí)行a=5時(shí),程序?qū)?這個(gè)常量拷貝到a所在的4個(gè)字節(jié)空間中,就完成了賦值操作. a是我們對(duì)那個(gè)整形變量的4個(gè)字節(jié)取的名字,是我們?nèi)藶榻o的,事實(shí)上計(jì)算機(jī)并不存儲(chǔ)a這個(gè)名字,只是我們編程時(shí)給那4個(gè)字節(jié)內(nèi)存取個(gè)名字好用.事實(shí)上程序在編譯時(shí),全部的a都轉(zhuǎn)換為了那個(gè)地址空間了.編譯成機(jī)器代碼后,沒(méi)有a這個(gè)說(shuō)法了.a這個(gè)名字只存在于我們編寫的代碼中.5不是被隨機(jī)分配的,而總是位于程序的數(shù)據(jù)段中,可能在不同的機(jī)器上在數(shù)據(jù)段中的位置可能不全都,它的地址其實(shí)不能以我們常用到的內(nèi)存地址來(lái)理解,由于牽扯到一個(gè)叫計(jì)算

6、機(jī)尋址方式的問(wèn)題,所以寫無(wú)數(shù)都說(shuō)明不清晰,你自己找本匯編語(yǔ)言的書來(lái)學(xué)一下吧. c語(yǔ)言中變量只是標(biāo)識(shí)對(duì)應(yīng)存儲(chǔ)單元內(nèi)的存儲(chǔ)內(nèi)容。與地址的對(duì)應(yīng)關(guān)系int a=3;a- a 一一對(duì)應(yīng)啊,變量名只是一個(gè)便于記憶識(shí)別的名稱,編譯器會(huì)將他編譯成相應(yīng)的內(nèi)存地址的. 變量都要占領(lǐng)一定的內(nèi)存。通過(guò)定義該變量的指針, 類型* 指針名=你要指向的變量名那么該指針中存儲(chǔ)的就是你的變量的內(nèi)存地址。 你的變量名 這樣就可以挺直獵取到你的變量地址或者定義引用 類型 引用名=變量名該引用可通過(guò)變量的地址來(lái)對(duì)變量舉行修改 變量名是給編譯器看的,編譯器按照變量是局部還是全局分配內(nèi)存地址或??臻g,所謂的變量名在內(nèi)存中不存在,操作時(shí)轉(zhuǎn)

7、換成地址數(shù)存放在寄存器中了。 編譯器會(huì)將合法的變量名放到一個(gè)叫 符號(hào)表 的一個(gè)表中。每個(gè)符號(hào)對(duì)應(yīng)一個(gè)地址。當(dāng)你調(diào)用此變量時(shí),就會(huì)按照此符號(hào)表找到對(duì)應(yīng)的地址,然后舉行操作。 還沒(méi)有運(yùn)行怎么會(huì)占用內(nèi)存呢??。ㄟ@一點(diǎn)還要疑惑嗎!?) 所謂在編譯期間分配空間指的是靜態(tài)分配空間(相對(duì)于用new動(dòng)態(tài)申請(qǐng)空間),如全局變量或靜態(tài)變量(包括一些復(fù)雜類型的常量),它們所需要的空間大小可以明確計(jì)算出來(lái),并且不會(huì)再轉(zhuǎn)變,因此它們可以挺直存放在可執(zhí)行文件的特定的節(jié)里(而且包含初始化的值),程序運(yùn)行時(shí)也是挺直將這個(gè)節(jié)加載到特定的段中,不必在程序運(yùn)行期間用額外的代碼來(lái)產(chǎn)生這些變量。 其實(shí)在運(yùn)行期間再看 變量 這個(gè)概念就不

8、再具備編譯期間那么多的屬性了(諸如名稱,類型,作用域,生存期等等),對(duì)應(yīng)的只是一塊內(nèi)存(惟獨(dú)首址和大小),所以在運(yùn)行期間動(dòng)態(tài)申請(qǐng)的空間,是需要額外的代碼維護(hù),以確保不同變量不會(huì)混用內(nèi)存。比如寫new表示有一塊內(nèi)存已經(jīng)被占用了,其它變量就不能再用它了; 寫delete表示這塊內(nèi)存自由了,可以被其它變量用法了。(通常我們都是通過(guò)變量來(lái)用法內(nèi)存的,就編碼而言變量是給內(nèi)存塊起了個(gè)名字,用以區(qū)別彼此) 內(nèi)存申請(qǐng)和釋放時(shí)機(jī)很重要,過(guò)早會(huì)走失數(shù)據(jù),過(guò)遲會(huì)耗費(fèi)內(nèi)存。特定狀況下編譯器可以幫我們完成這項(xiàng)復(fù)雜的工作(增強(qiáng)額外的代碼維護(hù)內(nèi)存空間,實(shí)現(xiàn)申請(qǐng)和釋放)。從這個(gè)意義上講,局部自動(dòng)變量也是由編譯器負(fù)責(zé)分配空間的。進(jìn)一步講,內(nèi)存管理用到了我們經(jīng)常掛在嘴邊的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論