2016-06-28 3 views
0

zurückgibt Dieser c-Code gibt den Wert an einer Speicheradresse zurück.Verständnis eines C# define, das einen Wert an einer Speicheradresse

value = MemoryRead((ptr)) 

MemoryRead ist ein #define definiert als

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

Wie funktionierts? Könnte jemand erklären, wie dies einen Wert an einer Adresse zurückgibt?

+2

Dies wurde bereits hunderte Male gefragt und erklärt. Bitte recherchieren Sie über SO, bevor Sie eine Frage stellen. – Lundin

Antwort

3

* (Adr) gibt den unter addr gespeicherten Wert zurück.

Der obige Code sieht selbsterklärend aus. Wenn du trocken liegst.

Betrachten value = MemoryRead((ptr))

Wird value = (*(volatile unsigned char*)((ptr)))

Die #define sieht wirklich kryptisch auf den ersten. Der Weg, dies zu verstehen, besteht darin, es in Stücke zu zerlegen, as done here;

Zu allererst

unsigned char 

bedeutet, dass wir eine Byte-Größe Speicherplatz verwenden. Byte ist 8-Bit breit.

unsigned char * 

bedeutet, dass wir einen Zeiger deklarieren, der auf eine Byte-große Position zeigt.

(unsigned char *) (ptr) 

bedeutet der Byte-große Zeiger verweist auf Adresse ptr. Der C-Compiler verweist auf die Adresse ptr. Der Assembly-Code wird am Ende mit ptr in Laden (LD) und Store (STR) Anweisungen.

(*(unsigned char *)(ptr)) 

Der erste Stern von links bedeutet, dass wir den Wert in Adresse ptr manipulieren wollen. * bedeutet "der Wert, auf den der Zeiger zeigt".

volatile 

flüchtige Kräfte die Compiler eine Last zu erteilen oder zu jeder Zeit MemoryRead Speicher zugegriffen werden als der Wert ohne den Compiler es zu wissen, ändern kann.

So wird jede Adresse, die unter ptr eingegeben wird, direkt von Ihrem Code zugegriffen. (Wenn die Adresse im Speicher vorhanden ist.)

+0

Bitte beachten Sie in Zukunft, dass Sie Ihre Quellen eindeutig unter http://stackoverflow.com/help/referencing angeben. – Matt

+0

Ich habe die Quelle erwähnt, überprüfen Sie die Geschichte? –