Zeiger auf den Zeiger initialisieren, indem mehrere Adressenoperatoren in C oder C ++ verwendet werden

8

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?

    
David Reis 28.09.2010, 07:45
quelle

9 Antworten

12

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: -))

    
Philipp 28.09.2010, 07:48
quelle
14

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.

    
Kirill V. Lyadvinsky 28.09.2010 07:48
quelle
7

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:

%Vor%     
schot 28.09.2010 07:52
quelle
5

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

    
Prasoon Saurav 28.09.2010 07:57
quelle
2

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%     
PP. 28.09.2010 07:48
quelle
2

Eine Adresse ist eine Nummer. Es hat nur eine eigene Adresse, wenn es in einer Variablen, d. H. Einem Zeiger, gehalten wird. Also

%Vor%

ergibt Sinn, aber

%Vor%

ergibt keinen Sinn. Jedoch

%Vor%

macht Sinn. Sinn machen?

    
EJP 28.09.2010 08:05
quelle
0

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.

    
Goz 28.09.2010 07:50
quelle
0

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.

    
jalf 28.09.2010 09:45
quelle
-1

Dies könnte funktionieren:

int ** ppa = & amp; (int *) {& amp; a};

    
fileoffset 28.09.2010 07:51
quelle

Tags und Links