C++ Typumwandlung mit Pointer
Ich komme aus einem hintergrund von C# und Java und ich kann nicht scheinen, um zu verstehen, was-casting mit dem Pointer also in C++.
Beispiel:
int x = 1;
char c = *((char*)&x);
Was tut es? Was ist es nützlich?
In C++ sollten Sie vermeiden, Gießen. Gießen ist ein Weg, zu sagen, der compiler "Nein, Nein, Sie werden denken, dass dies falsch ist, aber ich bin mir sicher, dass ich Recht habe". In C++, obwohl es immer besser zu machen der compiler die ganze Zeit richtig. Casting ist eine Art von Unterdrückung compiler-Fehler. Also im Grunde ist es mehr Konstruktive Fragen über casting für einen bestimmten Zweck, anstatt Gießen im Allgemeinen. Beide deiner Beispiele sollte vermieden werden, in C++ vollständig.
Möchten Sie wissen, über das Gießen mit Zeigern im Allgemeinen oder aus Ihrem Beispiel kann es scheinen, der Unterschied zwischen casting zu
Ich bearbeitet die post, jetzt sollte es klarer sein, denke ich.
Weder Ihre Beispiele kompilieren, so dass Sie nicht aussagekräftig sind.
nach dem Bearbeiten der code kann nicht kompiliert werden: sollte
Möchten Sie wissen, über das Gießen mit Zeigern im Allgemeinen oder aus Ihrem Beispiel kann es scheinen, der Unterschied zwischen casting zu
char *
und char const *
?Ich bearbeitet die post, jetzt sollte es klarer sein, denke ich.
Weder Ihre Beispiele kompilieren, so dass Sie nicht aussagekräftig sind.
nach dem Bearbeiten der code kann nicht kompiliert werden: sollte
char c = *((char*)x);
InformationsquelleAutor UnTraDe | 2012-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
In beiden deiner Beispiele, Sie machen Fehler, die machen den code nicht kompilieren. Also nehme ich an, dass Sie versuchen, Folgendes zu tun:
Je nach Architektur
c
wird nun entweder der Wert der zuletzt oder das am meisten signifikante byte derx
. In diesem Beispiel wäre dies entweder 0 oder 1 (dies kann tatsächlich verwendet werden, zur Erkennung der byte-Reihenfolge).Dein zweites Beispiel funktioniert nicht, Ursache, die Sie versuchen zu ignorieren, die
const
was in einer illegalen operation/bad cast (dies wird auch als "const-Korrektheit").Edit: in Bezug auf Ihren Kommentar über "was bedeutet es?":
In Ausdrücken:
&somevariable
wird dem zurückgeben der Adresse vonsomevariable
.*somevariable
davon aus, dass der Inhaltsomevariable
sind die Adresse für den tatsächlichen Wert, der wird dann zurückgegeben.In Erklärungen:
datatype
ist eine normale variable/Objekt. Dies ist bestanden "durch den Wert".datatype&
ist eine Referenz. Dies funktioniert genau wie bei normalen Variablen in Java/C# und wird per Referenz übergeben.datatype*
ist ein Zeiger. Dies beinhaltet nur die Adresse, wo der tatsächliche Wert liegt (siehe oben) und ist im wesentlichen durch Verweis übergeben, wie gut.Tatsächlichen Besetzungen arbeiten ziemlich ähnlich zu Java/C#, aber die Zeiger sind genau das: Sie zeigen die Lage des eigentlichen Wertes. Während dies könnte Sie verwirren, Zeigern in C/C++ arbeiten ziemlich viel, wie die standard-Variablen/Verweise in Java/C#.
Schau mal hier:
InformationsquelleAutor Mario
Casting in C++ funktioniert genauso wie das casting in Java keine Zeiger beteiligt.
Jedoch, was Sie hier tun, ist:
sagt der compiler, dass der Wert der
x
ist die Adresse eines Zeichens. Es entsprichtGibt es sehr wenige Zeiten, die Sie brauchen, um dies zu tun.
InformationsquelleAutor Lex R
Gibt es zwei grundlegend unterschiedliche Konzepte in C++, die beiden sind manchmal bezeichnet als "casting": Konvertierung, und man ist Neuinterpretation.
Konvertierung erstellt ein neues Objekt mit den "gleichen Wert" wie ein vorhandenes Objekt, sondern von einem anderen Typ. Hier sind einige Beispiele:
Beispiel 1: Art der Förderung
Beispiel 2: Abgeleitet-zu-Basis-Konvertierung
Auf der anderen Seite, Neuinterpretation ermöglicht uns die Behandlung von einer Variablen, als sei es ein anderes. Über die einzig richtige und nützliche Anwendung für diese ist Serialisierung, in der einen oder anderen form.
Beispiel 3: Serialisierung
Dem standard sagt, dass es ein Undefiniertes Verhalten für den Zugriff auf ein Objekt über einen Zeiger, der nicht den richtigen Typ (auch als "Typ Zweideutigkeiten"). Es ist zwar OK zum speichern ein Zeiger auf ein Objekt, sagen wir mal, ein
void*
und konvertieren Sie es dann zurück, und verwenden Sie es, es ist nicht OK, um zu behandeln, ein schweben, als sei es ein integer, etc. Die nur akzeptable Art Zugriff auf ein Objekt, als ob es war ein weiterer ist der, den ich gezeigt, nämlich die Behandlung von einem Objekt des TypsT
als ob es ein arraychar[sizeof(T)]
— das heißt, Sie sind berechtigt zum Zugriff auf die zugrunde liegende binäre Darstellung jedes Objekts.InformationsquelleAutor Kerrek SB
Sollten Sie es vermeiden, c-type-casts wie (char*) mit allen Mitteln. Wenn Sie wirklich tun müssen, ein Typ-cast haben Sie einen Blick auf
dynamic_cast
,static_cast
undreinterpret_cast
.Aber wie schon gesagt, das Sie nur selten brauchen, casting überhaupt.
Haben Sie einen Blick hier für fruther Informationen:
http://www.cplusplus.com/doc/tutorial/typecasting/
http://www.parashift.com/c++-faq/static-typing-and-cpp.html
http://www.parashift.com/c++-faq-lite/print-char-or-ptr-as-number.html
InformationsquelleAutor Martin
Benutzte ich viele Zeit her, dass-idiom, um Zugriff auf HW bei der angegebenen Adresse, auf kundenspezifische IO-board. So zum Beispiel das schreiben der PIC (programmable interrupt controller) zurücksetzen, einige flag (fiktive code):
InformationsquelleAutor CapelliC