Konvertierung von std::vector<> zu einem Doppel-pointer?
Ich Frage mich aus Neugier ob es möglich ist, werfen einen std::vector<> auf ein double-Zeiger.
Ich hatte noch nie ein Problem Vorbeigehen einen std::vector als Zeiger in diesem Mode:
std::vector<char> myCharVector;
myCharVector.push_back('a');
myCharVector.push_back('b');
myCharVector.push_back('c');
char *myCharPointer = &myCharVector[0];
So, ich war neugierig, ob es möglich war, zum zuweisen der Adresse des Zeigers in ähnlicher Weise wie diese:
char *myPointer = "abc";
char **myDoublePointer = &myPointer;
Ich versucht habe:
char **myDoublePointer = (char**)&myCharVector;
Aber es funktioniert nicht. Gibt es eine Möglichkeit, dies zu erreichen?
- Ist dies für etwas mehr als Neugier?
- Welche Fehler haben Sie für diese Zeile:
char **myDoublePointer = (char**)&myCharVector;
? - es ist kein Fehler
- Was dann nicht funktioniert, als Sie sagte, dass es nicht funktioniert ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wissen Sie bereits, dass
&myCharVector[0]
ist ein Zeiger aufchar
. Also, wenn Sie es speichern in eine variable:dann kann man sich die Adresse der variable:
Aber einfach dereferenzieren zweimal so:
ist ungültig, weil der Wert
(&myCharVector[0])
ist nicht im Speicher abgelegt, überall noch.char*& to_lvalue(char*&& x) { return x; }
Sie schreiben könntechar** ptrToCstr = &to_lvalue(&myCharVector[0])
, aber der Zeiger wäre unbrauchbar, nach der Aussage, die ist, was ich meinte, waren die Sicherheitsvorkehrungen.Sie definitiv nicht tun.
std::vector
und einchar **
sind völlig verschiedene Typen von Objekten, und Sie können nicht einfach "gegossen" einem zum anderen.Der Grund, warum Sie waren in der Lage, das zu tun
char *myCharPointer = &myCharVector[0]
ist, dassmyCharVector[0]
gibt Ihnen einechar
, und damit&myCharVector[0]
gibt Sie die Adresse, diechar
, die Sie zuordnen könnenchar *
.Die einzige Möglichkeit, die Sie konvertieren konnte eine vollständige
std::vector
in einechar *
(nichtchar **
) ist, um eine Schleife über Ihrestd::vector
aus und erstellen Sie einechar *
aus den Daten manuell.Zum Beispiel so etwas wie:
Dann
ptr
wird ein C-string vonchar
s.char *
?vector
Inhalte garantiert werden zusammenhängend gespeichert, so dass&v[i] == i + &v[0]
In C++11, können Sie tun:
Aber Sie können nicht die Adresse des return-Wert
data()
weil es nicht wieder eine Referenz auf das zugrunde liegende Lagerung, nur die Zeiger Wert.Wenn der Zweck ist, in der Lage sein, zu ändern, was der Zeiger verweist, dann können Sie wirklich wollen, einen Zeiger auf einen Vektor, sondern einen Zeiger auf einen Zeiger auf einen char. Aber, die
STL
Sie können nicht ändern die zugrunde liegenden Zeiger innerhalb der Vektor selbst, ohne durch den normalen-Vektor-APIs (wieresize
oderswap
).