Riferimenti e indicatori fanno la stessa cosa che conosco. C'è qualche differenza tra loro?
Se non c'è differenza, perché li chiamiamo riferimento non puntatore?
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.
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à).
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
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.
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
Leggi altre domande sui tag object-oriented programming-languages functional-programming terminology pointers