關(guān)于KeilC51指針的使用_第1頁(yè)
關(guān)于KeilC51指針的使用_第2頁(yè)
關(guān)于KeilC51指針的使用_第3頁(yè)
關(guān)于KeilC51指針的使用_第4頁(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、關(guān)于 KeilC51 指針的使用(參見(jiàn) page106-113,keiluv2usersguide09,2001)Kei中的指針?lè)譃閮煞N:一種是普通指針,兼容標(biāo)準(zhǔn) C語(yǔ)言的指針;另一種我翻譯成內(nèi)存特殊指針(memory-specific pointers,翻譯得不好:)一 .普通指針普通指針的定義方式如下:char * ptr;跟標(biāo)準(zhǔn) C 的定義方式一樣。這種指針占三個(gè)字節(jié),第一個(gè)字節(jié)是標(biāo)識(shí)存儲(chǔ) 類型,是指針指向的變量的數(shù)據(jù)類型;第二個(gè)字節(jié)是指針存儲(chǔ)地址的高位字 節(jié);第三個(gè)字節(jié)是指針存儲(chǔ)地址的低位字節(jié)。普通指針默認(rèn)存儲(chǔ)在內(nèi)部存儲(chǔ)器data,即片上RAM,如果想指定指針的存儲(chǔ)位置,可以在 * 后

2、加上存儲(chǔ)類型,如下面幾種定義方式:char * data ptr;/與char * ptr;等價(jià),即默認(rèn)的定義方式 char *xdata ptr;/ 指針存儲(chǔ)在片外 RAMchar * idata ptr;/指針存儲(chǔ)在 idatachar * pdata ptr;/指針存儲(chǔ)在 pdata由定義普通指針寫的程序最終代碼比較長(zhǎng),運(yùn)行速度相對(duì)較慢,因?yàn)?Keil 在編譯的時(shí)候不知道這個(gè)指針將要指向的變量的存儲(chǔ)位置,只有當(dāng)程序執(zhí)行的 時(shí)候才能知道,所以編譯器不能對(duì)這段代碼進(jìn)行優(yōu)化,不過(guò),這樣做的優(yōu)點(diǎn)是 此指針可以指向存儲(chǔ)在任何位置的變量。二.內(nèi)存特殊指針內(nèi)存特殊指針的定義方式為:char xdata

3、 * ptr;這個(gè)指針存儲(chǔ)的時(shí)候占的字節(jié)數(shù)是不一定的,占一個(gè)字節(jié)的變量類型為:idata, data, pdata, bdata;占兩個(gè)字節(jié)的變量類型為: code, xdata。char xdata * ptr;這里定義的ptr所指向的變量存儲(chǔ)在xdata中,即外部變量,這樣的話指針變量 ptr 占兩個(gè)字節(jié),我們?cè)俣x一個(gè)外部變量。char xdata variable1;ptr = & variablel; /這樣是正確的這段程序中,變量 variable1 存儲(chǔ)在外部存儲(chǔ)器中,是最合適的。char data variable2;ptr = &variable2;變量variable2存儲(chǔ)

4、在片上存儲(chǔ)器中。一個(gè)字節(jié)的指針即可以夠用,不過(guò)這樣寫程序也不算錯(cuò),我試過(guò) Keil 也能運(yùn)行。像普通指針一樣,定義內(nèi)存特殊指針時(shí)也可以指定指針的存儲(chǔ)位置。char xdata * data ptr;這個(gè)定義是說(shuō),定義一個(gè)指向數(shù)據(jù)類型為char的變量的指針,變量存儲(chǔ)在xdata 中;指針存儲(chǔ)在 data 中。內(nèi)存特殊指針產(chǎn)生的代碼可以經(jīng)過(guò)編譯器優(yōu)化,運(yùn)行速度較快。因?yàn)橹羔樦赶蜃兞康拇鎯?chǔ)位置是知道的,所以編譯器在編譯的時(shí)候可以進(jìn)行優(yōu)化。這樣 程序通過(guò)最簡(jiǎn)潔的方式去尋址,但是代價(jià)是降低了程序的靈活性。三.指針類型轉(zhuǎn)換編譯器在適當(dāng)?shù)臅r(shí)候?qū)χ羔樀念愋瓦M(jìn)行轉(zhuǎn)換,比如進(jìn)行參數(shù)傳遞的時(shí)候。 下面這個(gè)外部函數(shù)聲

5、明 printf 中的形參 ptr 是一個(gè)普通指針,編譯器為函數(shù)分配 三個(gè)字節(jié)。extern void printf(char * ptr);char data * ptr1 ;char xdata * ptr2 ;voia main(void)printf(ptr1);/ 在參數(shù)傳遞的時(shí)候轉(zhuǎn)換printf(ptr2);/ 不用轉(zhuǎn)換 在第一個(gè) printf() 調(diào)用中,實(shí)參是指向 data,占兩個(gè)字節(jié)。但是函數(shù)原型中形參是普通指針,占三個(gè)字節(jié)。這樣,參數(shù)傳遞 的過(guò)程中將 ptr1 擴(kuò)展成三個(gè)字節(jié)再傳遞。為了防止在傳遞參數(shù)的時(shí)候造成類似的指針類型錯(cuò)誤,在調(diào)用函數(shù)前,最 好進(jìn)行必要的外部函數(shù)聲明

6、(extern.)或引用相應(yīng)的頭文件 (#include.)或者在函 數(shù)調(diào)用填寫參數(shù)的時(shí)候加上數(shù)據(jù)類型轉(zhuǎn)換。這樣就有兩種的轉(zhuǎn)換方式:1.形參為普通類型,實(shí)參為內(nèi)存特殊類型:補(bǔ)充第一個(gè)字節(jié)為相應(yīng)的數(shù)據(jù)類型代碼,高位地址沒(méi)有的補(bǔ)充第二字節(jié)為0。2.實(shí)參為內(nèi)存特殊類型,形參為普通類型:截取相應(yīng)的地址字節(jié)。由上面的說(shuō)明我們可以看出,只要我們寫程序的時(shí)候在 * 兩邊都加上類型的 標(biāo)識(shí)符就可以了。但是在使用的時(shí)候 * 兩邊都有類型標(biāo)識(shí),很容易記混。char xdata * data ptr;這是一個(gè)指向一個(gè)存儲(chǔ)在xdata的數(shù)據(jù)類型為char的指針,但這個(gè)指針卻 存儲(chǔ)在 data 中。我是這樣記的,與char在一起的xdata標(biāo)識(shí)都是描述指針指向的變量的。 而跟指針在一起的標(biāo)識(shí)是描述指針自己的。四補(bǔ)充,關(guān)于C51里的存儲(chǔ)類型的說(shuō)明存儲(chǔ)的類型有:code, data, bdata, idata, pdata, xdata片內(nèi)ROM部分:code:8051 的只讀存儲(chǔ)器,程序代碼保存的地方片內(nèi) RAM 部分:data:片內(nèi)RAM的低128B,直接尋址訪問(wèn)idata:片內(nèi)所有RAM,只能使用間接尋址訪問(wèn)bdata:片內(nèi)RAM可位尋

溫馨提示

  • 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)論