Sia i puntatori che i riferimenti sono le funzionalità più potenti di C e C ++ che consentono ai programmatori di manipolare direttamente l'indirizzo di memoria per un'efficiente gestione della memoria.
Entrambe sono variabili che sono usate per riferirsi ad altri oggetti indirettamente e condividono alcune caratteristiche comuni sulla superficie. Sebbene condividano molte capacità comuni, sono anche molto complesse da comprendere.
Un puntatore è una variabile che contiene l'indirizzo di memoria di un'altra variabile, mentre un riferimento è come un puntatore che può essere utilizzato indirettamente per riferirsi a un'altra variabile.
La maggior parte dei programmatori sembra sviluppare una certa comprensione su quando utilizzare i puntatori e quando utilizzare i riferimenti, ma spesso incontrano problemi la cui soluzione sembra poco chiara.
Quindi per capire meglio la filosofia, capiamo la differenza tra i due.
Ogni variabile è una locazione di memoria che è definita dal suo indirizzo ed è accoppiata con un identificatore che contiene alcuni valori che possono essere cambiati durante il corso di un programma. In termini semplici, variabile è un simbolo che rappresenta una quantità.
Un puntatore è una variabile che contiene l'indirizzo di memoria di un'altra variabile. Un puntatore non è altro che un indirizzo e una variabile che memorizza un puntatore è chiamata variabile puntatore.
L'idea è di usare identificatori (o nomi) invece di indirizzi numerici per alleggerire l'onere della programmazione riducendo così la complessità dei programmi. Poiché questi indirizzi si riferiscono a posizioni reali nella memoria del computer, è possibile utilizzare i puntatori per accedere e manipolare il contenuto archiviato nella memoria.
Come qualsiasi variabile o costante, i puntatori devono essere dichiarati per i loro tipi. Poiché i puntatori contengono indirizzi di memoria che appartengono a un tipo di dati separato, devono essere dichiarati utilizzando i puntatori prima di poter lavorare con essi. La forma generale di una dichiarazione del puntatore è:
Data_type * var-name;
Qui, "Data_type" è il tipo base del puntatore e "var-name" è la variabile puntatore. L'asterisco (*) qui è usato per dichiarare il puntatore che designa la variabile "var-name" come variabile puntatore.
int * p; // puntatore intero
float * x; // puntatore mobile
Qui, la variabile "p" punta a un tipo di dati intero dichiarato come "int" che si riferisce al tipo di dati della variabile. Analogamente, nel secondo esempio, "float" si riferisce al tipo di dati della variabile "x" che in effetti è designato come puntatore a una variabile a virgola mobile.
Un riferimento è come un puntatore con accesso indiretto a una variabile. È come un alias per un'altra variabile, il che significa che è solo un altro nome per una variabile già esistente.
Consente ai programmatori di creare un secondo nome per la variabile che possono utilizzare per manipolare il contenuto archiviato in tale variabile. È un'entità che è un alias per un'altra variabile e ha lo stesso indirizzo della variabile originale. Supporta il pass-by-reference che agisce come parametri formali della funzione e una volta definito per riferirsi a una variabile, non può essere ripristinato il che significa che non può essere riferito a un'altra variabile.
A differenza dei puntatori, non hanno bisogno di un operatore di dereferenziamento per accedere al valore; infatti, possono essere usati come normali variabili.
int i;
int & ri = i;
Qui, "ri" è un riferimento intero inizializzato a "i". Dichiara "ri" come un oggetto di tipo "reference to int". Un riferimento può essere facilmente confuso con un puntatore che è una variabile indipendente, i cui valori di indirizzo non possono essere riassegnati una volta creati.
- Entrambi offrono funzionalità quasi simili in termini di usabilità e la distinzione può essere complicata. Un puntatore è solo una variabile che memorizza l'indirizzo di memoria di un'altra variabile, mentre un riferimento è come un alias per una variabile già esistente. Crea un secondo nome per una variabile che può essere utilizzata per modificare il contenuto archiviato in quella variabile.
- Un puntatore è come qualsiasi altra variabile che memorizza un pezzo di dati. A differenza di altre variabili, le variabili puntatore memorizzano gli indirizzi di memoria anziché i valori. Un puntatore viene dereferenziato usando l'operatore di riferimento indiretto * per accedere alla posizione di memoria della variabile a cui punta. Un riferimento, d'altra parte, non ha bisogno di alcun operatore di dereferenziamento per accedere al valore.
- A differenza dei puntatori che possono essere inizializzati in qualsiasi momento, i riferimenti devono essere assegnati al momento dell'inizializzazione. È possibile accedere direttamente ai puntatori, mentre non è possibile accedere direttamente ai riferimenti.
- Una variabile puntatore ha la propria posizione in memoria, il che significa che quando si dichiara un puntatore, si specifica una posizione che è un indirizzo di memoria assegnato a ciascuna unità di memoria. La variabile pointer ha lo stesso indirizzo in cui è stata salvata in memoria. Una variabile di riferimento, d'altra parte, è un alias per un'altra variabile, prendendo quindi l'indirizzo della variabile di riferimento.
- NULL rappresenta la fine dell'elenco che indica che il valore è sconosciuto e specifica che la variabile non ha uno spazio di indirizzi valido. Il valore NULL può essere assegnato direttamente a una variabile puntatore che suggerisce di non puntare dovunque, mentre NULL non può essere assegnato a una variabile di riferimento.
I puntatori sono sempre stati tra gli argomenti preferiti di discussione dei programmatori C / C ++ fino a quando non sono arrivati i riferimenti all'immagine. I riferimenti sono in qualche modo simili ai puntatori ma hanno una giusta quota di pro e contro in confronto. Mentre entrambi possono essere usati per cambiare le variabili locali di una funzione all'interno di un'altra funzione, hanno le loro differenze. Entrambe sono potenti funzionalità in C e C ++ che consentono di manipolare direttamente la memoria, ma con alcune eccezioni. Un puntatore contiene l'indirizzo di memoria di una variabile, mentre un riferimento è solo un alias per un'altra variabile.