C語言學習趣事_第1頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、c語言學習趣事在c語言中,對變量的用法實質(zhì)上是對計算機內(nèi)存中存儲內(nèi)容的拜訪,通過對內(nèi)存空間的引用來實現(xiàn)寫入和讀取。(注:c中有一個特別的關(guān)鍵字register, 用來聲明非存儲在內(nèi)存當中的變量,register用來要求將變量存儲在計算機的寄存器當中,這樣的變量主要的目的是加快cpu拜訪的速率)register關(guān)鍵字是 特定時期的產(chǎn)物,在內(nèi)存拜訪速度很慢的時代用register定義的變量,的確存儲在計算機cpu的寄存器當中,現(xiàn)在來說因為內(nèi)存的拜訪速率也很快,無數(shù)編譯器在 編譯的時候,會將register變量也存儲在內(nèi)存當中。這里主要研究簡介引用和解析引用,因此對register就不再研究。 間接

2、引用是指在匯編語言命令中不挺直指出內(nèi)存的地址,而是通過一個寄存器或者一個內(nèi)存空間來拜訪另外一個內(nèi)存空間。 exp: mov ax,bx 這樣就實現(xiàn)了一個間接引用,這條語句并不是挺直的拜訪bx寄存器,而是拜訪bx指向的內(nèi)存空間。在c中我們通過指針來實現(xiàn)間接引用。 exp: int var1; int *pvar=null; pvar= var1; *pvar=10; 這樣就實現(xiàn)了一個間接引用,通過一個內(nèi)存空間來拜訪另一個內(nèi)存空間,于是就實現(xiàn)了間接引用。在計算機的世界里面間接引用也叫做間接尋址。 上面的c語言實現(xiàn)翻譯成匯編命令可能為下面的形式: mov ax, 10 ;ax中存儲的內(nèi)容就是變量va

3、r1的內(nèi)存地址,事實上還可能涉及到物理地址的偏移量計算 匯編語言與c語言的最大區(qū)分就是可以顯式的拜訪寄存器和挺直計算得到某個內(nèi)存地址,其他的像循環(huán)語句等其他c語言控制結(jié)構(gòu)在匯編中一樣可以實現(xiàn), 在匯編語言中可以顯式的指定程序執(zhí)行的開頭地址,可以通過org命令來實現(xiàn),詳細就不研究了。 1、間接引用 我們可以通過幾個實例來看看間接引用: int var1; int var2; int *pvar1=null; int *pvar=null; pvar1= var1; /間接引用的必需條件,通過 運算符來實現(xiàn)將一個內(nèi)存空間的地址放到另外一個內(nèi)存空間中。 pvar= pvar1; /間接引用, 由于p

4、var1也是一個變量,指針變量,因此在c中也有一個與之對應(yīng)的內(nèi)存空間, *pvar1=10; /這里的意思就是將整型字面值放到*pvar1指向的內(nèi)存空間, pvar= var2, / 這里是不對的,雖然我們也可以通過一定的方式使之可以順當?shù)倪\行,但是假如那樣做的話,可能會引入未知的錯誤。 假如實在想通過pvar來間接引用var2的話,怎么辦呢? 那就和下面一樣: *pvar= var2; 然后像下面這樣來引用var2; *(*pvar)=10; /var2=10 2、解析引用 我也不知道這么說是否恰當,但是 * 運算在對地址舉行運算的時候,無數(shù)權(quán)威的文檔都這么說,我也就跟著說了,其實*的說明沒

5、有什么 特殊的,那就是: * 取出的是存儲在一個內(nèi)存空間區(qū)域(內(nèi)存區(qū)域1)的內(nèi)容,并且將取出的內(nèi)容說明為另外一塊內(nèi)存區(qū)域(內(nèi)存區(qū)域2)。然后我們就可以對 內(nèi)存區(qū)域2舉行拜訪。 假如舉行多重的解析運算,那么就會涉及到更多的內(nèi)存區(qū)域, 就像前面所說的: exp: int var1; /var1 內(nèi)存空間1,這里可以容易理解為 var1這個標示符指向內(nèi)存空間1,雖然我們并沒顯式的指出這個指向 int var2; /var2 內(nèi)存空間 2 int *pvar1=null; /pvar1 內(nèi)存空間3 int *pvar=null;/ pvar 內(nèi)存空間4 pvar1= var1; / 將內(nèi)存空間1的位置

6、放置到內(nèi)存空間3里面,形成了一個指向關(guān)系 pvar1=10; /將整型字面值10,放置到內(nèi)存空間3指向的內(nèi)存空間 1 里面。 *pvar= pvar1, / 形成一個多重指向,pvar 指向 pvar1, 而*pvar將指向 內(nèi)存空間1 3、 關(guān)于定義指針變量解析運算符的位置 exp: int *p; 和 int* p; 上面的兩種定義的方式在本質(zhì)上沒有區(qū)分, 但是假如涉及到更多的變量定義的話就可能引起誤會。 我的習慣是每個變量定義單獨占用一行: exp: int *p1, *p2; 這樣就很清晰了。 假如涉及到typef的話,那么就會另外的情形了, exp: typedef int *int

7、; int var1; int *var2; 很不幸的是無數(shù)人在這個地方會犯錯, 我也曾經(jīng)犯過錯,原本想聲明一個指向int變量的指針var2,結(jié)果是定義了一個指向int *類型的指針 變量。 現(xiàn)在我的習慣是: 1、在非typedef定義時*運算符逼近變量 2、在typedef定義新的的類型標示符時*逼近本來的類型標識符。 exp: int *p, *pp; typedef int* pint; 這樣意圖就很顯然了,并且不簡單引起誤會。 4、指針的四則運算 兩個指針變量相加是未定義的行為, 兩個指針變量想減的結(jié)果返回兩個內(nèi)存空間的距離, 兩個指針變量相稱是未定義的行為, 兩個指針變量相除是未定義的行為, 指針變量和整型值相加減是指針移動其指向的位置。 指針變量和整型值相乘除是未定義的行為。 exp: size_t (slen)(const char *str) char *start; start=str; while(*start)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論