
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、由x=y;引發(fā)的思考容易而言,浮現在賦值符 = 右邊的就是右值,浮現在賦值符 = 左邊的就是左值。 左值:在這個上下文環(huán)境中,編譯器認為x 的含義是x 所代表的地址。這個地址惟獨編譯器知道,在編譯的時候確定,編譯器在一個特定的區(qū)域保存這個地址,我們徹低不必考慮這個地址保存在哪里。 右值:在這個上下文環(huán)境中,編譯器認為y 的含義是y 所代表的地址里面的內容。這個內容是什么,惟獨到運行時才知道。 那你畢竟知道x,y代表什么了嗎? 這就要說到變量的含義,變量是對于編譯階段的特有屬性,下面來認真分析一下變量。 變量:用來標識(entify)一塊內存區(qū)域,這塊區(qū)域的值普通是可以更改的,這就是它 變 的由
2、來,但是我們可以通過用法如const等一些修飾符號來限定這一內存區(qū)域的操作特性(characteristic),即變量的操作特性。用const修飾的使變量不能更改的就和常量一樣的變量叫做常變量。 變量名:是一個標識符(identifier),用來指代一塊內存區(qū)域,即變量,用法變量使我們操作內存以區(qū)域(area),以塊(block)為單位,提高了便利性。 你的機器代碼中,是不會浮現變量名的;變量名是給我們程序員操作內存來用法的。 想想在匯編年月,沒有變量名,我們操作內存,都是用地址來挺直操作的,還要控制區(qū)域大小;固然匯編語言已經有了容易的變量。 對于編譯器,它會搜集我們的變量名,比如我們定義了一
3、個全局的int a;那么編譯器都為我們做了什么呢? 它會為程序預留4個字節(jié)的空間(假設在32位平臺),并把我們的變量名 a 保存進符號表,并用這個符號表的索引對應實際的空間。 假如下面浮現b = a;那么它就會按照符號表找到變量的真正的物理位置,取得它的值,賦給b。 這是寫編譯器需要做的,我們需要建立符號表。 但是實際在匯編層次上,操作的都是地址而已,不存在任何名稱了。 除了變量名不是內存地址,其他名都是地址。對么? 所謂的其他名無非是函數名、標識符常量名、指針名、數組名、結構名、類名等等。 比如指針名、數組名、函數名就是地址,它們分離表示指針所指向元素的地址、數組的首地址和函數的入口地址。
4、變量名雖然不挺直表示地址,但可用取地址符號 來獲得它所代表的變量的存放地址。由于在定義變量的同時會分配給它相應的空間。 但類和結構惟獨事例化時才為它分配空間,從而不能用取地址符號 來獲得類名或結構名的地址。 變量名是用來標識某個內存塊的 地址就是地址啦,如是變量名的話,用取地址運算符 就可以得到它標識的內存塊的地址, 而指針變量呢,它本身也是一個變量名,只不過它標識的那塊內存存放的是一個地址值 變量是地址的別號.就像剛生的小孩,你只知道他在地球上的某個位置,而不能叫出他名字,給你取個名 定義int a;時,編譯器分配4個字節(jié)內存,并命名該4個字節(jié)的空間名字為a(即變量名),當用到變量名a時,就
5、是在用法那4個字節(jié)的內存空間. 5是一個常數,在程序編譯時存放在代碼的常量區(qū)存放著它的值(就是5),當執(zhí)行a=5時,程序將5這個常量拷貝到a所在的4個字節(jié)空間中,就完成了賦值操作. a是我們對那個整形變量的4個字節(jié)取的名字,是我們人為給的,事實上計算機并不存儲a這個名字,只是我們編程時給那4個字節(jié)內存取個名字好用.事實上程序在編譯時,全部的a都轉換為了那個地址空間了.編譯成機器代碼后,沒有a這個說法了.a這個名字只存在于我們編寫的代碼中.5不是被隨機分配的,而總是位于程序的數據段中,可能在不同的機器上在數據段中的位置可能不全都,它的地址其實不能以我們常用到的內存地址來理解,由于牽扯到一個叫計算
6、機尋址方式的問題,所以寫無數都說明不清晰,你自己找本匯編語言的書來學一下吧. c語言中變量只是標識對應存儲單元內的存儲內容。與地址的對應關系int a=3;a- a 一一對應啊,變量名只是一個便于記憶識別的名稱,編譯器會將他編譯成相應的內存地址的. 變量都要占領一定的內存。通過定義該變量的指針, 類型* 指針名=你要指向的變量名那么該指針中存儲的就是你的變量的內存地址。 你的變量名 這樣就可以挺直獵取到你的變量地址或者定義引用 類型 引用名=變量名該引用可通過變量的地址來對變量舉行修改 變量名是給編譯器看的,編譯器按照變量是局部還是全局分配內存地址或??臻g,所謂的變量名在內存中不存在,操作時轉
7、換成地址數存放在寄存器中了。 編譯器會將合法的變量名放到一個叫 符號表 的一個表中。每個符號對應一個地址。當你調用此變量時,就會按照此符號表找到對應的地址,然后舉行操作。 還沒有運行怎么會占用內存呢?!(這一點還要疑惑嗎?。浚?所謂在編譯期間分配空間指的是靜態(tài)分配空間(相對于用new動態(tài)申請空間),如全局變量或靜態(tài)變量(包括一些復雜類型的常量),它們所需要的空間大小可以明確計算出來,并且不會再轉變,因此它們可以挺直存放在可執(zhí)行文件的特定的節(jié)里(而且包含初始化的值),程序運行時也是挺直將這個節(jié)加載到特定的段中,不必在程序運行期間用額外的代碼來產生這些變量。 其實在運行期間再看 變量 這個概念就不
8、再具備編譯期間那么多的屬性了(諸如名稱,類型,作用域,生存期等等),對應的只是一塊內存(惟獨首址和大?。栽谶\行期間動態(tài)申請的空間,是需要額外的代碼維護,以確保不同變量不會混用內存。比如寫new表示有一塊內存已經被占用了,其它變量就不能再用它了; 寫delete表示這塊內存自由了,可以被其它變量用法了。(通常我們都是通過變量來用法內存的,就編碼而言變量是給內存塊起了個名字,用以區(qū)別彼此) 內存申請和釋放時機很重要,過早會走失數據,過遲會耗費內存。特定狀況下編譯器可以幫我們完成這項復雜的工作(增強額外的代碼維護內存空間,實現申請和釋放)。從這個意義上講,局部自動變量也是由編譯器負責分配空間的。進一步講,內存管理用到了我們經常掛在嘴邊的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖北省十堰市單招職業(yè)傾向性測試題庫新版
- 2024年醫(yī)用供應裝置項目投資申請報告
- 生物-云南省師范大學附屬中學2025屆高三下學期開學考試試題和答案
- 2025年度國際貿易付款委托三方協議
- 2025年度全包家裝裝修與智能家居智能安防報警系統(tǒng)合同
- 2025年度單身公寓房產租賃合同(含智能家居)
- 2025年度信用卡旅游保險借款合同
- 二零二五年度勞動合同解除后離職員工離職后職業(yè)發(fā)展支持合同
- 2025年度XX小區(qū)智慧物業(yè)管理系統(tǒng)服務協議書
- 2025年度兼職協議書-旅游行業(yè)導游兼職人員合作協議
- 1《北京的春節(jié)》課后練習(含答案)
- (完整版)陸河客家請神書
- 2025年行業(yè)協會年度工作計劃
- DB3502T 160-2024 工業(yè)產品質量技術幫扶和質量安全監(jiān)管聯動工作規(guī)范
- 2025年學校教師政治理論學習計劃
- 集團專利管理制度內容
- 春節(jié)后復工安全教育培訓
- 提高發(fā)票額度的合同6篇
- 小散工程施工安全培訓
- 車站信號自動控制(第二版) 課件 -3-6502部分
- 商會2025年工作計劃
評論
0/150
提交評論