2012-08-07 12 views
6

Cosa di seguito è sbagliato per favore?Su puntatori e riferimenti C++, necessario chiarimento

È a mia conoscenza che un puntatore rappresenta un indirizzo di qualcosa di un certo tipo.

Quindi, int i = 18, un puntatore ad essa è int *pI = &i;

I 2 dichiarazioni seguenti sono validi

void foo (int &something) // Will accept an address of something 
void bar (int *something) // Will accept a pointer to something 

Quando si dichiara una funzione come

void bar (int *something) 

Sarà meglio inviamo un puntatore a qualcosa. Infatti, foo(pI) funziona.

Seguendo la stessa logica, se si considerano

void foo (int &something) 

dovremmo mandare un indirizzo di qualcosa che punta a un int come argomento, e allora:

Perché foo(&i) sbagliato?

risposta

5

void foo (int &something) // Will accept an address of something

Questo è corretto: int& è un riferimento, un concetto che è simile di puntatori in certi modi, ma non del tutto identici.

I riferimenti sono simili ai puntatori in quanto un valore può essere modificato tramite un riferimento, proprio come può essere modificato tramite un puntatore. Tuttavia, non esiste nulla come "riferimento null", mentre i puntatori NULL sono molto comuni.

Quando si chiama una funzione che accetta un riferimento, è sufficiente passare la variabile di riferimento a cui sta assumendo - è richiesto nessun operatore &:

void foo (something); // "something" must be a variable 
0

void foo (int & qualcosa) // Sarà accettare un indirizzo di qualcosa

No, anche se posso capire la confusione. Quella funzione prende un riferimento a int. I riferimenti sono garantiti come non nulli in un programma ben definito. È concettualmente simile a un puntatore, ma semanticamente diverso.

Per chiamare quella funzione non è necessario fare nulla di speciale.

int i = 10; 
foo(i); // passed to foo by reference 
0

Perché in C++ il & significa "tipo di riferimento" nel contesto di un prototipo di funzione come lo si utilizza qui. La funzione:

void foo (int &something) 

è in realtà specificando che un tipo di riferimento intero dovrebbe essere passato, in modo da sarebbe semplicemente chiamare questa funzione in questo modo:

foo(i); 

nota che in questo caso si sta ancora passando l'indirizzo di i nella funzione, ma lo si sta facendo come un tipo di riferimento piuttosto che come un puntatore raw.

0

Ci sono due significati per &.

Il primo è creare un puntatore da una variabile esistente.

Il secondo è di fare un riferimento.

Anche se entrambi usano lo stesso personaggio, sono due cose completamente diverse.