C'è qualche differenza tra puntatori e riferimenti? [duplicare]

7

Riferimenti e indicatori fanno la stessa cosa che conosco. C'è qualche differenza tra loro?

Se non c'è differenza, perché li chiamiamo riferimento non puntatore?

    
posta yfklon 18.04.2013 - 09:16
fonte

5 risposte

18

In generale, puoi fare la seguente distinzione:

Un riferimento è una variabile che fa riferimento a qualcos'altro e può essere utilizzato come alias per qualcos'altro.

Un puntatore è una variabile che memorizza un indirizzo di memoria, allo scopo di fungere da alias per ciò che è memorizzato a quell'indirizzo.

Quindi, un puntatore è un riferimento, ma un riferimento non è necessariamente un puntatore.

I puntatori sono una particolare implementazione del concetto di riferimento, e il termine tende ad essere usato solo per le lingue che danno accesso diretto all'indirizzo di memoria.

I riferimenti possono essere implementati internamente in una lingua usando i puntatori o usando qualche altro meccanismo. Ad esempio, Perl ha riferimenti simbolici , che si riferiscono alla variabile in base al nome anziché alla posizione di memoria. Ecco perché il codice strano come questo funziona:

my $bar = "foo";
$$bar = "Am I foo or bar?"; #This is actually a reference to $foo!
print $foo;

Questa distinzione tra riferimenti e puntatori non è una regola dura e veloce (il C ++ è l'eccezione principale, perché ha sia riferimenti che puntatori, con un significato distinto per ciascuno) ma copre la maggior parte dell'uso.

    
risposta data 18.04.2013 - 10:04
fonte
6

Non esiste una differenza generalmente accettata tra i riferimenti e i riferimenti se si osserva una distribuzione sufficientemente ampia delle lingue utilizzando i termini. Variante degli stessi concetti usa entrambi i termini (e qualche altro come l'accesso) quasi indifferentemente, tuttavia alcune caratteristiche tendono ad essere strettamente associate a uno dei termini:

  • se l'aritmetica è disponibile, non ho mai visto il termine usato come riferimento. (Ma il puntatore non implica che l'aritmetica sia disponibile)

  • se l'oggetto di riferimento non può essere modificato, non ho mai visto il puntatore del termine usato tranne quando esiste una proprietà costante che può essere applicata al puntatore e ad altre cose. (Ma il riferimento non implica la non riconvocabilità).

risposta data 18.04.2013 - 09:35
fonte
4

Puntatori e riferimenti sono segnaposto per utilizzare gli oggetti.

Invece di usare l'oggetto stesso puoi usare un puntatore o un riferimento per accedere e / o manipolare l'oggetto.

Car myCar = new Car();
Car& myCarReference = myCar;

La modifica del contenuto di myCarReference cambierà il contenuto di myCar.

I puntatori aggiungono operazioni di indirizzamento potenti ma potenzialmente pericolose ai riferimenti. Ad esempio:

Car* myCarPointer;

    // 0x12345678=the memory adress where one car 
    // object is supposed to be in memory.
myCarPointer = 0x12345678;  
myCarPointer->setColor(red);

myCarPointer+=20;  // advance 20 cars in an array

Potenzialmente pericoloso significa "puoi assegnare qualsiasi indirizzo a un puntatore." Il puntatore può puntare a una posizione in cui non vi è alcun oggetto auto.

Lingue come java e c # hanno introdotto riferimenti per rendere i programmi più robusti rispetto a c / c ++ che hanno solo puntatori

    
risposta data 18.04.2013 - 09:34
fonte
2

Stai giustapponendo le cose sbagliate. In C ++, i puntatori e i riferimenti hanno significati diversi, ma poiché non stai chiedendo del C ++, sospetto che non sia quello che cerchi. Se lo sei, dai un'occhiata alla risposta di Harssh.

Ciò che probabilmente vorresti sapere è la differenza tra un riferimento a un oggetto e l'oggetto stesso. Nella maggior parte delle lingue più recenti puoi passare un oggetto per valore o per riferimento.

Passare un oggetto per valore significa farne una copia. È possibile modificare quella copia senza alterare l'originale. Tuttavia, realizzare questa copia può costare molto accesso alla memoria.

Passare un oggetto per riferimento significa passare un handle a quell'oggetto. Questo è più economico perché non è necessario fare una copia. Significa anche che qualsiasi modifica apportata influirà sull'originale.

I linguaggi di programmazione funzionale tendono a passare tutto in base al loro valore perché evitano gli effetti collaterali.

    
risposta data 18.04.2013 - 09:31
fonte
1

Puntatori e riferimenti sembrano abbastanza diversi (i puntatori usano gli operatori * ?? e - > ??, i riferimenti usano.), ma sembrano fare cose simili. Sia i puntatori che i riferimenti consentono di fare riferimento ad altri oggetti indirettamente. Come, quindi, decidi quando usarne uno e non l'altro? In primo luogo, riconoscere che non esiste un riferimento nullo. Un riferimento deve sempre riferirsi a qualche oggetto. Di conseguenza, se si dispone di una variabile il cui scopo è fare riferimento a un altro oggetto, ma è possibile che non ci sia un oggetto a cui fare riferimento, si dovrebbe rendere la variabile un puntatore, poiché in tal caso è possibile impostarla su null. D'altra parte, se la variabile deve sempre fare riferimento a un oggetto, ad esempio se il tuo progetto non consente la possibilità che la variabile sia nullo, dovresti probabilmente rendere la variabile un riferimento.

per maggiori informazioni link

    
risposta data 18.04.2013 - 09:20
fonte