在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            C51 指針問題

            作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
            一般指針
            一般指針的聲明和使用均與標準C相同,不過同時還可以說明指針的存儲類型,例如:
            long * state;為一個指向long型整數(shù)的指針,而state本身則依存儲模式存放。
            char * xdata ptr;ptr為一個指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲器中。

            一般指針本身用3個字節(jié)存放,分別為存儲器類型,高位偏移,低位偏移量。2.存儲器指針

            基于存儲器的指針說明時即指定了存貯類型,例如:

            char data * str;str指向data區(qū)中char型數(shù)據(jù)
            int xdata * pow; pow指向外部RAM的int型整數(shù)。
            這種指針存放時,只需一個字節(jié)或2個字節(jié)就夠了,因為只需存放偏移量。


            /*.........................................................................................
            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本身存在于自動分配的空間,一般位于data中,指向的內容位于xdata
            char xdata * data px
            px本身存在于data空間,指向的內容位于xdata
            data char xdata * px =char xdata *data px


            data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
            idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式
            訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補充:c中idata做指針式的訪問效果很好)
            xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
            pdata:外部擴展RAM的低256個字節(jié),地址出現(xiàn)在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優(yōu)點,具體用法屬于中級問題,這里不提。




            xdata unsigned char *p; 和 unsigned char* xdata p; 完全一樣。
            因為C寫法中允許“最前面的存儲類型修飾符修飾最后面的對象。


            (1) unsigned char * xdata p
            表明指針本身位于Xdata,至于指向什么類型的地址,自由變換.
            例如
            unsigned chara_data;
            unsigned char xdata b_xdata;

            當p = &a_data;*p等于a_data;它表示p指向的地址自動轉換成data地址

            當p = &b_xata;*p等于b_data;它表示p指向的地址自動轉換成xdata地址



            (2)unsigned char xdata * p//注意:這種用法不推薦
            表示指針指向的地址是xdata



            unsigned chara_data;
            unsigned char xdata b_xdata;

            當p = &a_data;*p不等于a_data;因為盡管相對地址相同,但a_data的地址在data空間中,而p指向的地址是xdata空間。(KEIL也會提示空間匹配錯誤)



            當p = &b_xata;*p等于b_data;因為b_data本身就放在xdata,而p指向的地址是xdata。所以沒有問題。

            所以在定義指針的時候,如果不確定傳入的參數(shù)的空間范圍是哪里,最好不要限定指針指向的地址。例如直接用unsigned char *p。它會根據(jù)不同參數(shù)的空間,自動尋找相應的地址!
            unsigned char *p //推薦


            關鍵詞: C51指針問

            評論


            技術專區(qū)

            關閉