(DWORD*) *(DWORD*) Frage

04/30/2012 20:28 Zwawo#1
Könntet ihr mir bitte einmal erklären was das:
Code:
DWORD* ViTableStart;
DWORD source;
ViTableStart = (DWORD*) *(DWORD*)(source);
macht? Soweit ich das sehe ist das ein typecast. Nur warum (DWORD*) *(DWORD*)?

Wo ist der Unterschied zu:
Code:
DWORD* ViTableStart;
DWORD source;
ViTableStart = (DWORD*)source;
?
04/30/2012 20:32 Dr. Coxxy#2
source wird in einen dword* gecastet und dann dereferenziert.
das dereferenzierte wird dann wieder in einen dword* gecastet.
04/30/2012 20:34 MrSm!th#3
Du kannst natürlich auch Casts aneinanderreihen. Rein semantisch ist das da richtig, aber es würde etwas anders deutlicher werden, was es macht:

Code:
ViTableStart = (DWORD*) *(DWORD**)(source);
Du siehst, es wird erst in einen Doppelzeiger, einen Zeiger auf einen Zeiger auf ein DWORD gecastet. Danach wird dieser mithilfe des * dereferenziert, man erhält also den eigentlichen DWORD*.
Dann könnte man sich den ersten Cast sparen, da der Typ sowieso schon DWORD* ist.

Dein Beispiel castet einfach nur die DWORD Variable in einen DWORD*.

Bessere Version also:

Code:
ViTableStart = *(DWORD**)(source);
Quote:
source wird in einen dword* gecastet und dann dereferenziert.
das dereferenzierte wird dann wieder in einen dword* gecastet.
Das Dereferenzierte wäre ja ein DWORD. Würde man gleich in DWORD** casten, wäre der weitere Cast unnötig und man bräuchte nur zu dereferenzieren.
04/30/2012 20:41 Dr. Coxxy#4
Quote:
Originally Posted by MrSm!th View Post
Das Dereferenzierte wäre ja ein DWORD. Würde man gleich in DWORD** casten, wäre der weitere Cast unnötig und man bräuchte nur zu dereferenzieren.
ich hab ja auch nur erklärt, was der code macht, nicht wie er besser wäre :P

aber mr smith hat natürlich recht mit dem DWORD** ist wesentlich einfacher lesbar und ordentlicher.