reinterpret_cast
-
Ein Cast, den ich leider noch nie so richtig verstanden habe.
Wenn ich folgenden Code habe:int main() { int value = 1000; int *p1 = &value; char *p2 = reinterpret_cast<char *>(p1); return 0; }Als was muss ich mir *p2 nun vorstellen? In wie weit kann ich es verwenden? Beinhaltet es die gleiche Adresse wie *p1?
Oder ist das einzige was ich mit *p2 nun machen kann folgendes?int *p3 = reinterpret_cast<int *>(p2); cout << *p3 << endl; //1000Und gibt es einen speziellen Fall, wo ihr immer reinterpret_cast verwendet?
MfG
Stromberg
-
The reinterpret_cast operator changes one data type into another. It should be used to cast between incompatible pointer types.
Es gibt nur sehr wenige Situationen in denen man einen reinterpret_cast braucht - deshalb sollte man ihn sehr überlegt einsetzen!
Du kannst ihn dir als eine Art C-Cast vorstellen. Google hilft da aber wohl mehr.
Und gibt es einen speziellen Fall, wo ihr immer reinterpret_cast verwendet?
Ja, bin aber grad schreibfaul.
-
Den brauchst du z.B., wenn du einen long-Wert in einen Pointer konvertieren willst o.ä. Wir benutzen sowas beim interagieren mit LabView. LabView kennt nunmal keine Pointer, wir müssen aber Pointer auf verschiedene structs an LabView übergeben (Cast nach long), die dann an verschiedene C-Funktionen weitergereicht werden (Handles). Wir machen das allerdings mit guten, alten C-Casts.

Dein Beispiel ist auch ganz gut. Wenn ich z.B. einen Bilddatenpuffer als char* habe und mich jetzt gerade pixelweise (bei 32 Bit pro Pixel) im Puffer bewegen will, dann kann ich mir den Pointer einfach nach int* casten und rutsche beim Inkrementieren halt immer einen ganzen Pixel weiter. Sowas in der Art...
-
Beinhaltet es die gleiche Adresse wie *p1?
ja
In wie weit kann ich es verwenden?
Die Addresse wir dann als char interpretiert. Gerade mit char find ich es nützlich, da es so einfach möglich ist an die Bytedarstellung zu kommen.
-
knivil schrieb:
Ja, bin aber grad schreibfaul.
Deshalb bin ich ja da!

-
Ich hoff auch einfach mal mit der Zeit lernt man das durch diverse verschiedenen Programmiersituationen.
MfG
StrombergEDIT:
Wo ist der Unterschied zwischen:long value = 1000; char *a = reinterpret_cast<char *>(&value);und
long value = 1000; char *a = reinterpret_cast<char *>(value);???
-
Probier's doch, letzteres crasht bei mir. Einen Wert in einen Pointer wandeln? *NO*
-
Was ist der unterschied zwischen
value
und
&value?
-
Also:
long value = 1000; char *a = reinterpret_cast<char *>(value);geht bei mir genauso.
MfG
Stromberg
-
Stromberg* schrieb:
geht bei mir genauso.
reinterpret_cast interpretiert den wert den du ihm gibst als den typen den du ihm angibst.
ergo:
reinterpret_cast<int*>(i)
der wert von i wird als adresse interpretiert an deren stelle ein int liegt.
reinterpret_cast<int*>(&i)
hier wird die adresse von i als adresse interpretiert an deren stelle ein int liegt.verständlich?
-
Das wollte ich mit meinem Beispiel ja auch deutlich machen. Du konvertierst/castest einen Pointer in eine long-Variable (z.B. für LabView) und castest ihn dann wieder zurück in einen Pointer...