日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]  keil中的指針分為兩種,一種是普通指針,兼容標(biāo)準(zhǔn)C語言的指針;另一種是我翻譯成內(nèi)存特殊指針(memory-specific pointers,翻譯的不好:>)    一、普通指針  普通指針的定義方式如下, char * ptr; 跟標(biāo)準(zhǔn)

  keil中的指針分為兩種,一種是普通指針,兼容標(biāo)準(zhǔn)C語言的指針;另一種是我翻譯成內(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ǔ)位置,可以在 * 后加上存儲(chǔ)類型,如下面幾種定義方式:

char*dataptr;//與char*ptr;等價(jià),即默認(rèn)的定義方式char*xdataptr;//指針存儲(chǔ)在片外RAMchar*idataptr;//指針存儲(chǔ)在idatachar*pdataptr;//指針存儲(chǔ)在pdata

  由定義普通指針寫的程序最終的代碼較長,運(yùn)行速度相對(duì)較慢,因?yàn)閗eil在編譯的時(shí)候不知道這個(gè)指針將要指向的變量的數(shù)據(jù)類型,只有當(dāng)程序執(zhí)行的時(shí)候才能知道,所以編譯器不能對(duì)這段代碼進(jìn)行優(yōu)化,不過,這樣做的優(yōu)點(diǎn)是,此指針可以指向存儲(chǔ)在任何位置的變量。

  二、內(nèi)存特殊指針

  內(nèi)在特殊指針的定義方式為:

  charxdata*ptr;

  這個(gè)指針存儲(chǔ)的時(shí)候占的字節(jié)數(shù)是不一定的,占一個(gè)字節(jié)的變量類型為:idata,data, pdata, bdata。占兩個(gè)字節(jié)的變量類型為: code,xdata。下圖是我在keil上測試的時(shí)候截的圖:

  注意:

  charxdata*ptr;

  這里定義的ptr所指向的變量存儲(chǔ)在xdata中,即外部變量,這樣的話指針變量ptr占兩個(gè)字節(jié),我們?cè)俣x一個(gè)外部變量。

  charxdatavariable1;  ptr=&variable1;//這樣是正確的。

  這段程序中,變量variable1是存儲(chǔ)在外部存儲(chǔ)器中的,是最合適的。

chardatavariable2;ptr=&variable2;

  變量variable2存儲(chǔ)在片內(nèi)存儲(chǔ)器中。一個(gè)字節(jié)的指針即可以夠用,不過這樣寫程序也不算錯(cuò),我試過keil也能運(yùn)行。像普通指針一樣,定義內(nèi)存特殊指針時(shí)也可以指定指針的存儲(chǔ)位置。

  charxdata*dataptr;

  這個(gè)定義是說,定義了一個(gè)指向(存儲(chǔ)在xdata)變量的一個(gè)(存儲(chǔ)在data)的指針。

  內(nèi)在特殊指針產(chǎn)生的代碼可以經(jīng)過編譯器優(yōu)化,運(yùn)行速度較快。因?yàn)橹羔樦赶蜃兞康拇鎯?chǔ)位置是知道的,所以編譯器在編譯的時(shí)候可以進(jìn)行優(yōu)化。這樣程序通過最簡潔的方式去尋址,但是代價(jià)是降低了程序的靈活性。

  三、指針類型轉(zhuǎn)換

  編譯器在適當(dāng)?shù)臅r(shí)候?qū)χ羔樀念愋瓦M(jìn)行轉(zhuǎn)換。如進(jìn)行參數(shù)傳遞的時(shí)候。如下面這個(gè)外部函數(shù)聲明printf中的形參ptr是一個(gè)變通指針,編譯器為函數(shù)分配三個(gè)字節(jié)

externvoidprintf(char*ptr);chardata*ptr1;charxdata*ptr2;voiamain(void){printf(ptr1);//這樣在參數(shù)傳遞的時(shí)候轉(zhuǎn)換printf(ptr2);//未轉(zhuǎn)換}

  在第一個(gè)printf()調(diào)用中,實(shí)參是指向data,占兩個(gè)字節(jié)。但是函數(shù)原型中形參是變通指針,占三個(gè)字節(jié)。這樣,參數(shù)傳遞的過程中將ptr1擴(kuò)展了成三個(gè)字節(jié)再傳遞。

  注意:為了防止在傳遞參數(shù)的時(shí)候造成類似的指針類型錯(cuò)誤。在調(diào)用函數(shù)前,最好進(jìn)行必要的外部函數(shù)聲明(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ù)類型代碼。高位地址沒有的補(bǔ)充第二字節(jié)為0
  2、實(shí)參為內(nèi)存特殊類型,形參為普通類型:截取相應(yīng)的地址字節(jié)。

  

  四,由上面的說明我們可以看出,,只要我們寫程序的時(shí)候在 * 兩面都加上類型的標(biāo)識(shí)符就可以了。但是在使用的時(shí)候 * 兩邊都有類型標(biāo)識(shí),很容易記混。

charxdata*dataptr;

  這是一個(gè)指向一個(gè)存儲(chǔ)在xdata的數(shù)據(jù)類型為char的指針,但這個(gè)指針卻存儲(chǔ)在data中。我是這樣記的,與char在一起的xdata標(biāo)識(shí)都是描述指針指向的變量的。而跟指針在一起的標(biāo)識(shí)是描述指針自己的。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉