久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3341|回復: 0
打印 上一主題 下一主題
收起左側

C語言指針變量訪問ROM中數組常量的方法

[復制鏈接]
跳轉到指定樓層
樓主
ID:351097 發表于 2020-2-28 16:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    當使用到ASCII碼字庫點陣的時候,我們習慣定義一個大的數組來存放。如果沒有指定存儲區域,數組一般都是保存在RAM當中的,如果單片機的RAM空間比較緊張,就需要將數組保存在ROM當中。對于51單片機,如果只在數組前加const,只是聲明這個數組的內容是只讀的,但是,數組還是保存在RAM中的,可以通過查看代碼空間大小進行驗證。網上還有不少人認為只要聲明const,就是只讀的,就是放在ROM里面的,這個是錯誤的。這個只讀只是你無法直接更改數組的內容,因為編譯器會強制報錯。但是,通過指針指向數組的方式,還是可以間接更改數組的內容的。要指定數組保存在ROM里,除了需要const關鍵字,還需要加上數據存儲類型(區域修飾符)。對于keil,用code表明變量存放在ROM中;對于IAR for 8051,用__code表面變量存放在ROM中。由于我用的平臺是IAR for 8051,單片機是STC8A8K64S4A12,測試也是基于這個平臺。下面講一下用指針訪問ROM中數組的方法。 首先定義一個數組                                                                                                                                                                          __code const unsignde char array[] = {0x11,0x22,0x33,0x44};//聲明數組保存在ROM里
再定義一個指針:                                                                                                                                                                                      
unsigned char __code const *p;//這是一個指針,指向code區域的unsigned char常量(const)
再獲取數組的首地址                                                                                                                                                                                      
p = array;//指向數組首地址                                                                                                                                                                           
    這里指針p一定要用__code修飾,如果不用__code修飾,會報錯。指針可以正常訪問ROM中數組的內容。
不過可能有人可能會這樣做:                                                                                                                                                                           
__code const unsignde char array[] = {0x11,0x22,0x33,0x44};//聲明數組保存在ROM里                                                                                      
unsigned char *p;                                                                                                                                                                                       
p = (unsigned char*)array;//指向數組首地址   (類型強制轉換)                                                                                                                  
    這樣雖然編譯不會報錯,p指向的地址就是數組存放在ROM當中的地址值,這樣看起來沒問題,把地址值打印出來驗證也正確,但是在使用的時候,會發現怎么也沒法訪問到正確的數組內容,而是其他內容,感覺像是指針跑飛了一樣。其實原因很簡單,定義指針p時沒有加上__code,那么p指向的地址空間是在RAM里面的。也就是在RAM中訪問和ROM相同地址值的內容,當然永遠也無法訪問到數組的內容的。                                                     
    如果硬要這樣定義指針p,也不是沒有辦法訪問ROM中的數組。比如先將ROM數組復制到RAM中,再進行訪問,可以按照如下操作:                    
__code const unsignde char array[] = {0x11,0x22,0x33,0x44};//聲明數組保存在ROM里                                                                                    
unsigned char *p;                                                                                                                                                                                       
unsigned char a[4];                                                                                                                                                                                      
for(unsigned char i = 0; i < 4; i++)                                                                                                                                                                  
{                                                                                                                                                                                                                  
    a[ i] = array[ i]; //直接訪問ROM的數組,再復制到RAM中                                                                                                                                      
}
p = a;
    里面多了一個操作,再定義一個數組a,然后將數組array存放在ROM里面的內容復制到存放在RAM里面的a,再用p指向a的地址。雖然最終也可以正常獲取數據,但是效率低下,這種操作是最不值得推薦的。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久久久丝袜 | 99国内精品| 亚洲国产精品一区二区三区 | 色婷婷综合网站 | 欧美成人一区二区 | 成人天堂噜噜噜 | 欧美日韩精品一区二区三区四区 | 99精品视频一区二区三区 | 91视频久久| 亚洲欧美成人在线 | 国产一区二区 | 性天堂网 | 精产国产伦理一二三区 | 日本黄色影片在线观看 | 神马久久久久久久久久 | 亚洲天堂中文字幕 | 欧美日韩专区 | 欧美中文一区 | 在线观看中文字幕 | 国产精品久久久久久久久久免费看 | 日韩av一区在线观看 | 欧美黑人巨大videos精品 | 国产精品一区二区三区四区 | 日韩一区二区三区视频 | 国产精品视频网 | 成人av一区| 日韩一区二区三区在线 | 精品一区二区在线视频 | 色小姐综合网 | 成人一区二区三区在线 | 九九热久久免费视频 | 欧美欧美欧美 | 亚洲成人精品一区二区 | 亚洲一级淫片 | 国产一级片在线观看视频 | 一级免费毛片 | 日韩毛片 | 国产精品视频导航 | 特黄特色大片免费视频观看 | 日韩小视频在线 | 久国久产久精永久网页 |