2013-06-13 17 views
9

Stavo leggendo C++ Primer e ho notato che c'è una dichiarazione dice:È possibile definire un puntatore a un riferimento?

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

Ma ho appena scritto un codice di esempio e dimostra che è possibile creare un puntatore a un riferimento (la variabile d).

Il codice è pubblicato qui di seguito:

#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; 
} 

Quindi, qualcosa di sbagliato con la mia prova? O la dichiarazione in C++ Primer è errata?

Sto leggendo la C++ Primer quinta edizione. L'affermazione è a pagina 52, 2.3.2.

+0

@taocp oops, modificato :-) – yegle

+2

Passa 'e' a' int & (* e) = d; 'e ottieni' errore: impossibile dichiarare il puntatore a 'int &' 'da GCC. Ciò rende abbastanza chiaro che 'd' non è un puntatore a un riferimento. – chris

+0

Pensa a un riferimento come alias all'oggetto originale. I riferimenti non allocano, memoria dealloc. Come è stato fatto notare che si può puntare l'oggetto a cui fa riferimento il nome dell'alias, ma non c'è niente nella memoria per rappresentare l'alias stesso (è solo nel codice). Al contrario, un puntatore alloca la memoria e memorizza un valore (anche se il valore è NULL). –

risposta

9

La citazione è giusta, poiché stai facendo un puntatore che punta all'oggetto originale, non al suo riferimento. Il codice seguente mostra questo fatto:

#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; 
} 

uscita:

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

Se hai detto che sei in grado di fare un puntatore di riferimento, allora l'uscita sopra dovrebbe essere diverso.

+1

Modificare il 'printf' a' printf ("0: 1% X: X 2%:% X \ n", e una, ptr_to_ref1, ptr_to_ref2); 'renderebbe più evidente :-) – yegle

+2

Unire la solita StackOverflow nitpicking, il printf dovrebbe avere segnaposti di% p, non% x (puntatori a 64 bit rispetto a 32 bit int, yada yada). +1 comunque per una buona spiegazione. – Yamodax

+0

@yegle: bel punto. Ho incluso questo nel mio codice di esempio. Grazie! – keelar

7

Quello che il libro dice è corretto. Il puntatore punta a a, non al riferimento stesso (b) perché il riferimento stesso (b) non esiste in memoria come tale e quindi non ha indirizzo.

+3

Il riferimento * potrebbe * avere memoria, ad esempio se è passato in una funzione - il compilatore può implementarlo come puntatore internamente. Questa implementazione non ti è però esposta. –

+0

Ovviamente hai ragione. – Yamodax

5

No, non è possibile creare un puntatore a un riferimento. Se si utilizza l'indirizzo-dell'operatore & su di esso si ottiene l'indirizzo dell'oggetto a cui si fa riferimento, non il riferimento stesso.

0

Pensa a un riferimento come un alias all'oggetto originale. I riferimenti non allocano, memoria dealloc. Come è stato sottolineato, puoi puntare all'oggetto referenziato dal nome dell'alias, ma non c'è nulla in memoria che rappresenti l'alias stesso (è solo nel codice). Al contrario, un puntatore alloca la memoria e memorizza un valore (anche se il valore è NULL).

Problemi correlati