2016-06-28 68 views
0

這個c代碼返回一個內存地址的值。瞭解一個C#define返回一個內存地址的值

value = MemoryRead((ptr)) 

MemoryRead#define定義爲

#define MemoryRead(A) (*(volatile unsigned char*)(A)) 

這是如何工作的?有人可以解釋這是如何在地址處返回一個值嗎?

+2

這已被問及解釋數百次之前。在提出問題之前,請對SO進行一些研究。 – Lundin

回答

3

*(addr)返回存儲在addr處的值。

上面的代碼看起來不言自明。如果你乾涸。

考慮value = MemoryRead((ptr))

變爲value = (*(volatile unsigned char*)((ptr)))

#define起初看起來很神祕。理解這一點的方法是將其分解成小塊,as done here;

首先,

unsigned char 

意味着我們正在使用一個字節大小的內存位置。字節爲8位,寬度爲 。

unsigned char * 

表示我們正在聲明一個指向字節大小位置的指針。

(unsigned char *) (ptr) 

表示字節大小的指針指向地址ptr。 C編譯器 將參考地址ptr。彙編代碼將在加載(LD)和存儲(STR)指令中使用ptr 結束。

(*(unsigned char *)(ptr)) 

從左邊的第一個星號表示我們要操作 在地址ptr值。 *表示「 指針指向的值」。

volatile 

揮發性力編譯器發出加載和存儲隨時 MemoryRead被訪問的值可能會改變不知道它的編譯器 。

因此,在ptr處輸入的任何地址都將直接通過您的 代碼進行訪問。 (如果該地址存在於存儲器中)。

+0

將來,請務必明確引用您的來源,請參閱http://stackoverflow.com/help/referencing。 – Matt

+0

我確實提到了源代碼,請檢查歷史記錄? –