2013-06-13 2 views
9

ich C++ Primer las, und ich bemerkte, dass eine Aussage gibt es sagt:Ist es möglich, einen Zeiger auf eine Referenz zu definieren?

Because references are not objects, they don't have addresses. Hence, we may not define a pointer to a reference.

Aber ich schrieb nur ein Beispiel-Code und zeigt, dass es möglich ist, einen Zeiger auf eine Referenz (die d Variable) zu erstellen.

Der Code ist unten geschrieben:

#include <iostream> 
using namespace std; 

int main(){ 
    int a = 1024; 

    int &b = a; // a reference to int 
    int &c = b; // a reference to another reference 
    int *d = &b; // a pointer to a reference 
    int *(&e) = d; // a reference to a pointer 

    a = 100; 
    cout << b << endl; 
    cout << c << endl; 
    cout << *d << endl; 
    cout << *e << endl; 
} 

So etwas falsch mit meinem Test? Oder ist die Aussage in C++ Primer falsch?

Ich lese C++ Primer fünfte Ausgabe. Die Erklärung befindet sich auf Seite 52, 2.3.2.

+0

@taocp oops, bearbeitet :-) – yegle

+2

Schalten Sie 'e' auf' int & (* e) = d; 'und Sie erhalten' error: kann den Zeiger nicht auf 'int &' 'von GCC deklarieren. Das macht es ziemlich klar, dass "d" kein Zeiger auf eine Referenz ist. – chris

+0

Stellen Sie sich eine Referenz als Alias ​​für das ursprüngliche Objekt vor. Referenzen nicht zuordnen, Dealloc-Speicher. Wie bereits erwähnt, können Sie auf das Objekt zeigen, auf das der Aliasname verweist, aber es gibt nichts im Speicher, um den Alias ​​selbst darzustellen (nur im Code). Im Gegensatz dazu weist ein Zeiger Speicher zu und speichert einen Wert (selbst wenn der Wert NULL ist). –

Antwort

9

Das Zitat ist richtig, da Sie einen Zeiger auf das ursprüngliche Objekt, nicht seine Referenz, machen. Der folgende Code zeigt diese Tatsache:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int a = 0; 
    // two references referring to same object 
    int& ref1_a = a; 
    int& ref2_a = a; 
    // creating a different pointer for each reference 
    int* ptr_to_ref1 = &ref1_a; 
    int* ptr_to_ref2 = &ref2_a; 

    printf("org: %p 1: %p 2: %p\n", &a, ptr_to_ref1, ptr_to_ref2); 

    return 0; 
} 

Ausgang:

org: 0x7fff083c917c 1: 0x7fff083c917c 2: 0x7fff083c917c 

Wenn Sie die Sie in der Lage sind, einen Zeiger als Referenz zu machen, dann ist die obige Ausgabe anders sein sollte.

+1

Ändern Sie 'printf' in' printf ("0:% X 1:% X 2:% X \ n", & a, ptr_to_ref1, ptr_to_ref2); 'würde es offensichtlicher machen :-) – yegle

+2

Bei dem üblichen stackoverflow nitpicking, Das printf sollte% p-Platzhalter haben, nicht% x (64-Bit-Zeiger vs. 32-Bit-Inte, Yada Yada). +1 für eine gute Erklärung. – Yamodax

+0

@yegle: Netter Punkt. Ich habe dies in meinen Beispielcode aufgenommen. Vielen Dank! – keelar

7

Was das Buch sagt, ist korrekt. Ihr Zeiger zeigt auf a, nicht auf die Referenz selbst (b), weil die Referenz selbst (b) nicht als solche im Speicher existiert und daher keine Adresse hat.

+3

Die Referenz * könnte * Speicher haben, zum Beispiel wenn sie in eine Funktion übergeben wird - der Compiler kann sie intern als Zeiger implementieren. Diese Implementierung ist Ihnen jedoch nicht bekannt. –

+0

Sie haben natürlich Recht. – Yamodax

5

Nein, Sie können keinen Zeiger auf eine Referenz machen. Wenn Sie den Adressoperator & verwenden, erhalten Sie die Adresse des Objekts, auf das Sie verweisen, nicht die Referenz selbst.

0

Stellen Sie sich eine Referenz als Alias ​​für das ursprüngliche Objekt vor. Referenzen nicht zuordnen, Dealloc-Speicher. Wie bereits erwähnt, können Sie auf das Objekt zeigen, auf das der Aliasname verweist, aber es gibt nichts im Speicher, um den Alias ​​selbst darzustellen (nur im Code). Im Gegensatz dazu weist ein Zeiger Speicher zu und speichert einen Wert (selbst wenn der Wert NULL ist).