C51 指針問題
一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時(shí)還可以說(shuō)明指針的存儲(chǔ)類型,例如:
long * state;為一個(gè)指向long型整數(shù)的指針,而state本身則依存儲(chǔ)模式存放。
char * xdata ptr;ptr為一個(gè)指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲(chǔ)器中。
一般指針本身用3個(gè)字節(jié)存放,分別為存儲(chǔ)器類型,高位偏移,低位偏移量。2.存儲(chǔ)器指針
基于存儲(chǔ)器的指針說(shuō)明時(shí)即指定了存貯類型,例如:
char data * str;str指向data區(qū)中char型數(shù)據(jù)
int xdata * pow; pow指向外部RAM的int型整數(shù)。
這種指針存放時(shí),只需一個(gè)字節(jié)或2個(gè)字節(jié)就夠了,因?yàn)橹恍璐娣牌屏俊?br />
/*.........................................................................................
char * xdata ptr;//ptr本身放在Xdata(XRAM)區(qū)
char xdata * ptr;//ptr指向的數(shù)據(jù)放在Xdata(XRAM)區(qū)
........................................................................................*/
char xdata * px
char xdata * data px
data char xdata * px
這3者有什么不同??
char xdata * px
px本身存在于自動(dòng)分配的空間,一般位于data中,指向的內(nèi)容位于xdata
char xdata * data px
px本身存在于data空間,指向的內(nèi)容位于xdata
data char xdata * px =char xdata *data px
data:固定指前面0x00-0x7f的128個(gè)RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata:固定指前面0x00-0xff的256個(gè)RAM,其中前128和data的128完全相同,只是因?yàn)樵L問的方式不同。idata是用類似C中的指針方式
訪問的。匯編中的語(yǔ)句為:mox ACC,@Rx.(不重要的補(bǔ)充:c中idata做指針式的訪問效果很好)
xdata:外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata:外部擴(kuò)展RAM的低256個(gè)字節(jié),地址出現(xiàn)在A0-A7的上時(shí)讀寫,用movx ACC,@Rx讀寫。這個(gè)比較特殊,而且C51好象有對(duì)此BUG,建議少用。但也有他的優(yōu)點(diǎn),具體用法屬于中級(jí)問題,這里不提。
xdata unsigned char *p; 和 unsigned char* xdata p; 完全一樣。
因?yàn)镃寫法中允許“最前面的存儲(chǔ)類型修飾符修飾最后面的對(duì)象。
(1) unsigned char * xdata p
表明指針本身位于Xdata,至于指向什么類型的地址,自由變換.
例如
unsigned chara_data;
unsigned char xdata b_xdata;
當(dāng)p = &a_data;*p等于a_data;它表示p指向的地址自動(dòng)轉(zhuǎn)換成data地址
當(dāng)p = &b_xata;*p等于b_data;它表示p指向的地址自動(dòng)轉(zhuǎn)換成xdata地址
(2)unsigned char xdata * p//注意:這種用法不推薦
表示指針指向的地址是xdata
unsigned chara_data;
unsigned char xdata b_xdata;
當(dāng)p = &a_data;*p不等于a_data;因?yàn)楸M管相對(duì)地址相同,但a_data的地址在data空間中,而p指向的地址是xdata空間。(KEIL也會(huì)提示空間匹配錯(cuò)誤)
當(dāng)p = &b_xata;*p等于b_data;因?yàn)閎_data本身就放在xdata,而p指向的地址是xdata。所以沒有問題。
所以在定義指針的時(shí)候,如果不確定傳入的參數(shù)的空間范圍是哪里,最好不要限定指針指向的地址。例如直接用unsigned char *p。它會(huì)根據(jù)不同參數(shù)的空間,自動(dòng)尋找相應(yīng)的地址!
unsigned char *p //推薦
評(píng)論