C++, wie die Adresse, gespeichert in einer void-pointer?
wie kann ich die Speicher-Adresse der Wert, den ein Zeiger zeigt? in meinem Fall ist es ein void-Zeiger.
nur die Zuordnung zu einem uint-gibt mir diese Fehlermeldung:
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
Dank!
Sie bereits hast die Adresse. Das ist es, was die Zeiger ist. Was du meinst ist "wie bekomme ich die ganze Zahl, die C++ - maps die Adresse an". 😉
Wenn Sie möchten, drucken Sie den Wert einfach drucken Sie die void*. Wenn Sie möchten, dass die Adresse nur zu halten, die leere*. Wenn Sie möchten, dass die Adresse der Variablen, die eine void* dann weisen Sie es einem void*.
Wenn Sie möchten, drucken Sie den Wert einfach drucken Sie die void*. Wenn Sie möchten, dass die Adresse nur zu halten, die leere*. Wenn Sie möchten, dass die Adresse der Variablen, die eine void* dann weisen Sie es einem void*.
InformationsquelleAutor clamp | 2009-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Paul Hsieh
Ich denke, es ist ausreichend zu konvertieren
void*
zusize_t
in diesem speziellen Frage aus drei Gründen:Der Fragesteller hat nicht angegeben, ob er
will eine portable Lösung, oder nicht. Er
sagte, dass es mit ihm arbeitete. Ich weiß nicht genau, was
das bedeutet aber
es ist mir klar, er ist
arbeiten auf IA-32 auf Windows oder andere
system unter den geschützten Modus. Dass
bezeichnet das umwandeln eines Zeigers auf ein
integer ist eine definierte operation auf
das system, auch wenn es nicht definiert ist, die von standard-C++.
Zweiten habe ich vorgeschlagen, zuerst die Umwandlung der Zeiger auf
int
klar bedeutungslos, wie litb und jalf mich zeigte. Ich korrigierte die Fehler, die ich gemacht habe und ersetzt Sieint
mitsize_t
.Schließlich habe ich versucht, meine Festplatte etwas zu finden, das relevant, was Sie vorgeschlagen, als Lösung in den Normen. Leider konnte ich nichts finden, was relevant ist. Ich habe diesen Hinweis: ANSI ISO IEC 14882 2003. Ich denke, sellibitze wies darauf hin, dass es wird Teil des kommenden standards. Ich weiß wirklich nicht, über C, und offensichtlich C99 eingeführt, das die perfekte Lösung. Ich möchte jemanden, mir zu zeigen, eine tragbare Lösung in C++.
Bitte, zögern Sie nicht, meine Fehler zu korrigieren, ich bin noch student an der uni 🙂
Dank,
Ein reinterpret_cast aus einem Zeiger auf eine integer-Typen ist nur dann wohlgeformt, wenn der integer-Typ ist "groß genug", so dass ein round-trip-pointer->integer->Zeiger verlustfrei.
Nein! Es ist sehr schlecht. Warum wurde es akzeptiert?
In der Praxis
size_t
sollte groß genug sein, auf den meisten Boxen (aber es gibt keine Garantie in der Theorie)."...während ptrdiff_t...eindeutig [hat], um für die gesamte Zeiger-space-Bereich". @Paul: ich denke nicht so. Die Sprache, das Gedächtnis-Modell ist "ein oder mehr Sequenzen von aufeinanderfolgenden bytes". Zeiger-Arithmetik beschränkt sich auf Hinweise von derselben "Sequenz". Ich denke, ein ptrdiff_t nicht groß genug, um einen Zeiger.
InformationsquelleAutor AraK
Einen Zeiger in C und C++ ist die Verkörperung einer Speicheradresse in einer abstrakten form. Sie können eine Umsetzung bestimmte Zeichenfolge interpretation von Zeiger:
Ein anderer Weg ist, um ihn zu wirken, zu intptr_t:
Den NULL-Zeiger in C++ ist definiert als gleich "0", also vermutlich würde man die equiavlent (intptr_t) 0 in der obigen operation. Trotzdem ist es bis zu Ihnen, und was die Umsetzung spezifischer Kenntnisse, die Sie haben zu interpretieren, dass eine Speicher-Adresse.
Der Punkt ist, dass bei Plattformen, die Nutzung bizarre Speicher-Modelle wie die 16-bit-x86-DOS-Compiler, die Segmente mit offsets als Ihre Speicher-Modell, Zeiger können in vielerlei Hinsicht interpretiert werden. In einer raw-Adresse Vertretung NULL sein könnte DS:0 oder SS:0, anstatt nur eine Ebene 0.
-1 es gibt keine Garantie, dass in C++
(integer-type)null-pointer
ausgewertet0
natürlich. Du verwechselst "NULL" mit "null-Zeiger". Lesen Sie stackoverflow.com/questions/423823/...InformationsquelleAutor Paul Hsieh
Benötigen Sie einen cast - entweder ein
reinterpret_cast
(empfohlen):oder ein C-style cast (wirklich nicht empfehlenswert):
sizeof(UInt32) == sizeof(void *)
Ja, auf 64-bit-Systeme, das ist ganz klar falsch.
InformationsquelleAutor sharptooth
Können Sie eine string-Repräsentation der Adresse mit sprintf() oder zeigen Sie es mit printf() mit %p Formatbezeichner, e.g:
Wenn Sie wollen einfach nur die Adresse zu führen Zeiger-Arithmetik auf, wandeln Sie Sie in eine entsprechende konkrete Daten-Typ Zeiger, sonst werfe es in einen integer wie bereits vorgeschlagen.
InformationsquelleAutor Clifford
In C++ ich war in der Lage, drucken Sie die Spitzen-Adresse mit:
InformationsquelleAutor Zac