Es ist mir gerade eingefallen, dass ich nicht weiß, wie man einen Zeiger auf einen Zeiger von einem Nicht-Zeiger-Wert mit einer Anweisung in C ++ initialisiert:
%Vor%Fehle ich etwas, ist die zwei Aussage die einzige Möglichkeit, es zu tun?
Wenn Sie einen Zeiger auf einen Zeiger haben möchten, muss der Zeiger, auf den Sie zeigen möchten, irgendwo im Speicher liegen. Daher kann es keine "Ein-Schritt-Lösung" geben, da Sie eine Zeigervariable benötigen, auf die Sie zeigen können .
(Hinweis: Dieser Satz ist kein linguistischer Versuch, "Punkt" so oft wie möglich in einem Satz zu verwenden: -))
Sie können den Zeiger nicht auf einen temporären Wert setzen. &a
ergibt einen r-Wert. Es ist erlaubt, keine tatsächliche Adresse zu haben.
Die anderen haben Recht: Ihr Zeiger auf einen Zeiger muss auf etwas zeigen. In C99 können Sie jedoch schummeln, indem Sie zusammengesetzte Literale verwenden:
%Vor% Zusammengesetzte Literale sind im Grunde nur unbenannte Objekte und haben dieselben Speicherregeln wie normale Objekte. (Sie können jedoch einem Funktionsumfang keine statische Dauer für die Dauer des statischen literalen Speichers mit dem Schlüsselwort static
angeben). Sie können sie sogar verschachteln, sodass Sie das vorherige Beispiel in eine einzelne Zeile umschreiben können:
C ++ 03 [ Section 5.3.1
] sagt
Das Ergebnis des unären & amp; -Operators ist ein Zeiger auf seinen Operanden. Der Operand soll ein lvalue oder eine qualifizierte ID sein. Im ersten Fall, wenn der Typ des Ausdrucks "T" ist, ist der Typ des Ergebnisses "Zeiger auf T".
In &&a
, &
operator kann nicht auf das Ergebnis von &a
angewendet werden, da das Ergebnis kein lvalue
ist.
Lesen Sie auch diesen Thread
Sie möchten einen Zeiger (nennen Sie PP
) auf einen Zeiger (nennen Sie P
)?
Dann muss P
tatsächlich existieren. Was bedeutet, dass Sie es erklären müssen.
Natürlich wird der Compiler bei &&a
fehlschlagen - weil Sie die Adresse einer Adresse nicht annehmen können. Sie können die Adresse eines Zeigers annehmen - aber Sie müssen zuerst den Zeiger deklarieren.
Also:
%Vor%Wenn Sie Folgendes tun:
%Vor%Zuallererst existiert jetzt auf dem Stapel. Es hat offensichtlich eine Speicheradresse (dh seine Stapelposition). Dies ist, was Sie b zuweisen. b existiert nun auch auf dem Stack und Sie können dann seine Speicheradresse an c übergeben. Sie können jedoch die Adresse der Adresse eines Werts ohne den Zwischenstapel nicht verwenden, da sie nicht existiert, ohne sie explizit zuerst zu erstellen.
Das Problem, wenn Sie etwas wie &&a;
tun, ist, dass Sie nach der Adresse der Adresse von a
fragen.
Das macht keinen Sinn. Wir können die Adresse von a
gut erhalten, aber das gibt uns keine Variable, die wir die Adresse nehmen können. Es gibt uns nur einen Zeigerwert. Bis dieser Wert irgendwo gespeichert ist, können wir seine Adresse nicht nehmen.
Wenn Sie Code wie 2+2
haben, hat das Ergebnis auch keine Adresse. Es ist nur der Wert 4, aber es wurde noch nirgendwo gespeichert, so dass wir keine Adresse nehmen können. Sobald wir es in eine Variable int
speichern, können wir die Adresse dieser Variablen übernehmen.
Grundsätzlich ist das Problem der Unterschied zwischen Werten und Variablen. Ein Wert ist nur eine Zahl (oder ein Zeichen oder einige andere Daten). Eine Variable ist eine Stelle im Speicher, an der ein Wert gespeichert wird. Eine Variable hat eine Adresse, aber einen Wert nicht.
In C ++ - sprechen, es ist der Unterschied zwischen rvalues und lvalues. Ein rvalue ist im Wesentlichen ein temporärer Wert, typischerweise ein Wert, der von einer anderen Operation zurückgegeben wurde (wie in Ihrem Fall der Operator &
), der aber noch nirgendwo gespeichert wurde.
Sobald Sie es in einer Variablen speichern, erhalten Sie einen lvalue, und lvalues haben eine Adresse, die Sie nehmen können.
Also ja, Sie brauchen die zwei separaten Aussagen. Zuerst nehmen Sie die Adresse und dann speichern Sie diese Adresse irgendwo. Und dann kannst du die Adresse von diesem "irgendwo" nehmen.
Dies könnte funktionieren:
int ** ppa = & amp; (int *) {& amp; a};