這個c代碼返回一個內存地址的值。瞭解一個C#define返回一個內存地址的值
value = MemoryRead((ptr))
MemoryRead
是#define
定義爲
#define MemoryRead(A) (*(volatile unsigned char*)(A))
這是如何工作的?有人可以解釋這是如何在地址處返回一個值嗎?
這個c代碼返回一個內存地址的值。瞭解一個C#define返回一個內存地址的值
value = MemoryRead((ptr))
MemoryRead
是#define
定義爲
#define MemoryRead(A) (*(volatile unsigned char*)(A))
這是如何工作的?有人可以解釋這是如何在地址處返回一個值嗎?
*(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
處輸入的任何地址都將直接通過您的 代碼進行訪問。 (如果該地址存在於存儲器中)。
將來,請務必明確引用您的來源,請參閱http://stackoverflow.com/help/referencing。 – Matt
我確實提到了源代碼,請檢查歷史記錄? –
這已被問及解釋數百次之前。在提出問題之前,請對SO進行一些研究。 – Lundin