Puntatori C ++ con esempi

Sommario:

Anonim

Cosa sono i puntatori?

In C ++, un puntatore fa riferimento a una variabile che contiene l'indirizzo di un'altra variabile. Come le variabili regolari, i puntatori hanno un tipo di dati. Ad esempio, un puntatore di tipo integer può contenere l'indirizzo di una variabile di tipo integer. Un puntatore di tipo carattere può contenere l'indirizzo di una variabile di tipo carattere.

Dovresti vedere un puntatore come una rappresentazione simbolica di un indirizzo di memoria. Con i puntatori, i programmi possono simulare la chiamata per riferimento. Possono anche creare e manipolare strutture dati dinamiche. In C ++, una variabile puntatore si riferisce a una variabile che punta a un indirizzo specifico in una memoria puntata da un'altra variabile.

In questo tutorial C ++ imparerai:

  • Cosa sono i puntatori?
  • Indirizzi in C ++
  • Sintassi della dichiarazione del puntatore
  • Operatore di riferimento (&) e Operatore di deferenza (*)
  • Puntatori e matrici
  • Puntatore NULL
  • Puntatori di variabili
  • Applicazione di puntatori
  • Vantaggi dell'utilizzo dei puntatori

Indirizzi in C ++

Per comprendere i puntatori C ++, è necessario comprendere come i computer memorizzano i dati.

Quando crei una variabile nel tuo programma C ++, gli viene assegnato dello spazio nella memoria del computer. Il valore di questa variabile è memorizzato nella posizione assegnata.

Per conoscere la posizione nella memoria del computer in cui sono archiviati i dati, C ++ fornisce l' operatore & (riferimento). L'operatore restituisce l'indirizzo che occupa una variabile.

Ad esempio, se x è una variabile, & x restituisce l'indirizzo della variabile.

Sintassi della dichiarazione del puntatore

La dichiarazione di C ++ assume la seguente sintassi:

datatype *variable_name;
  • Il tipo di dati è il tipo di base del puntatore che deve essere un tipo di dati C ++ valido.
  • Il nome_variabile è dovrebbe essere il nome della variabile del puntatore.
  • L'asterisco usato sopra per la dichiarazione del puntatore è simile all'asterisco usato per eseguire l'operazione di moltiplicazione. È l'asterisco che contrassegna la variabile come un puntatore.

Ecco un esempio di dichiarazioni di puntatori valide in C ++:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Operatore di riferimento (&) e Operatore di deferenza (*)

L'operatore di riferimento (&) restituisce l'indirizzo della variabile.

L'operatore di dereferenziazione (*) ci aiuta a ottenere il valore che è stato memorizzato in un indirizzo di memoria.

Per esempio:

Se abbiamo una variabile data il nome num, memorizzata nell'indirizzo 0x234 e memorizzando il valore 28.

L'operatore di riferimento (&) restituirà 0x234.

L'operatore di dereferenziazione (*) restituirà 5.

Esempio 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

Produzione:

Come funziona:

Ecco uno screenshot del codice:

Spiegazione del codice:

  1. Importa il file di intestazione iostream. Questo ci consentirà di utilizzare le funzioni definite nel file di intestazione senza ottenere errori.
  2. Includere lo spazio dei nomi std per utilizzare le sue classi senza chiamarlo.
  3. Chiama la funzione main (). La logica del programma dovrebbe essere aggiunta all'interno del corpo di questa funzione. La {segna l'inizio del corpo della funzione.
  4. Dichiarare una variabile intera x e assegnarle un valore di 27.
  5. Dichiara una variabile puntatore * ip.
  6. Memorizza l'indirizzo della variabile x nella variabile pointer.
  7. Stampa del testo sulla console.
  8. Stampa il valore della variabile x sullo schermo.
  9. Stampa del testo sulla console.
  10. Stampa l'indirizzo della variabile x. Il valore dell'indirizzo è stato memorizzato nella variabile ip.
  11. Stampa del testo sulla console.
  12. Stampa il valore di memorizzato all'indirizzo del puntatore.
  13. Il programma dovrebbe restituire un valore in caso di corretta esecuzione.
  14. Fine del corpo della funzione main ().

Puntatori e matrici

Le matrici e i puntatori funzionano in base a un concetto correlato. Ci sono diverse cose da notare quando si lavora con array con puntatori. Il nome dell'array stesso denota l'indirizzo di base dell'array. Ciò significa che per assegnare l'indirizzo di una matrice a un puntatore, non è necessario utilizzare una e commerciale (&).

Per esempio:

p = arr;

Quanto sopra è corretto poiché arr rappresenta l'indirizzo degli array. Ecco un altro esempio:

p = &arr;

Quanto sopra non è corretto.

Possiamo convertire implicitamente un array in un puntatore. Per esempio:

int arr [20];int * ip;

Di seguito una valida operazione:

ip = arr;

Dopo la dichiarazione di cui sopra, ip e arr saranno equivalenti e condivideranno le proprietà. Tuttavia, è possibile assegnare un indirizzo diverso a ip, ma non possiamo assegnare nulla a arr.

Esempio 2:

Questo esempio mostra come attraversare un array utilizzando i puntatori:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

Produzione:

Ecco uno screenshot del codice:

Spiegazione del codice:

  1. Dichiarare una variabile puntatore intero ip.
  2. Dichiara un array denominato arr e memorizza 6 interi al suo interno.
  3. Assegna arr a ip. IP e arr diventeranno equivalenti.
  4. Crea un ciclo for. La variabile di ciclo x è stata creata per iterare sugli elementi dell'array dall'indice 0 a 5.
  5. Stampa i valori memorizzati all'indirizzo IP del puntatore. Verrà restituito un valore per iterazione e verranno eseguite 6 ripetizioni in totale. Endl è una parola chiave C ++ che indica la riga finale. Questa azione consente di spostare il cursore sulla riga successiva dopo la stampa di ogni valore. Ogni valore verrà stampato in una singola riga.
  6. Per spostare il puntatore alla successiva posizione int dopo ogni iterazione.
  7. Fine del ciclo for.
  8. Il programma deve restituire qualcosa in caso di corretta esecuzione.
  9. Fine del corpo della funzione main ().

Puntatore NULL

Se non esiste un indirizzo esatto da assegnare, alla variabile pointer può essere assegnato un NULL. Dovrebbe essere fatto durante la dichiarazione. Tale puntatore è noto come puntatore nullo. Il suo valore è zero ed è definito in molte librerie standard come iostream.

Esempio 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Produzione:

Ecco uno screenshot del codice:

Spiegazione del codice:

  1. Dichiarare una variabile puntatore ip e assegnargli un valore NULL.
  2. Stampa il valore della variabile del puntatore ip insieme al testo sulla console.
  3. Il programma deve restituire un valore una volta completato con successo.
  4. Fine del corpo della funzione main ().

Puntatori di variabili

Con C ++, puoi manipolare i dati direttamente dalla memoria del computer.

Lo spazio di memoria può essere assegnato o riassegnato a piacere. Ciò è reso possibile dalle variabili Pointer.

Le variabili puntatore puntano a un indirizzo specifico nella memoria del computer puntato da un'altra variabile.

Può essere dichiarato come segue:

int *p;

O,

int* p;

Nell'esempio you, abbiamo dichiarato la variabile pointer p.

Conterrà un indirizzo di memoria.

L'asterisco è l'operatore di dereferenziazione che significa un puntatore a.

Il puntatore p punta a un valore intero nell'indirizzo di memoria.

Esempio 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Produzione:

Ecco uno screenshot del codice:

Spiegazione del codice:

  1. Dichiarare una variabile puntatore pe una variabile x con un valore di 30.
  2. Assegna l'indirizzo della variabile x a p.
  3. Stampa il valore della variabile del puntatore p accanto al testo sulla console.
  4. Il programma deve restituire un valore una volta completato con successo.
  5. Fine del corpo della funzione main ().

Applicazione di puntatori

Le funzioni in C ++ possono restituire un solo valore. Inoltre, tutte le variabili dichiarate in una funzione vengono allocate nello stack delle chiamate di funzione. Non appena la funzione ritorna, tutte le variabili dello stack vengono distrutte.

Gli argomenti della funzione vengono passati per valore e qualsiasi modifica apportata alle variabili non cambia il valore delle variabili effettive che vengono passate. L'esempio seguente aiuta a illustrare questo concetto: -

Esempio 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

Produzione:

Ecco uno screenshot del codice:

Spiegazione del codice:

  1. Crea un prototipo di una funzione denominata test che richiederà due parametri interi.
  2. Chiama la funzione main (). Aggiungeremo la logica del programma all'interno del suo corpo.
  3. Dichiarare due variabili intere a e b, ciascuna con un valore di 5.
  4. Stampa del testo sulla console. Endl (riga finale) sposterà il cursore per iniziare a stampare nella riga successiva.
  5. Stampa il valore della variabile a sulla console insieme ad altro testo. Endl (riga finale) sposterà il cursore per iniziare a stampare nella riga successiva.
  6. Stampa il valore della variabile b sulla console insieme ad altro testo. Endl (riga finale) sposterà il cursore per iniziare a stampare nella riga successiva.
  7. Creare una funzione denominata test () che accetta gli indirizzi della variabile a e b come parametri.
  8. Stampa del testo sulla console. \ N creerà una nuova riga vuota prima che il testo venga stampato. Endl (riga finale) sposterà il cursore per iniziare a stampare nella riga successiva dopo la stampa del testo.
  9. Stampa il valore della variabile a sulla console insieme ad altro testo. Endl (riga finale) sposterà il cursore per iniziare a stampare nella riga successiva.
  10. Stampa il valore della variabile b sulla console insieme ad altro testo. Endl (riga finale) sposterà il cursore per iniziare a stampare nella riga successiva.
  11. Il programma deve restituire un valore una volta completato con successo.
  12. Fine del corpo della funzione main ().
  13. Definizione della funzione test (). La funzione dovrebbe accettare due variabili puntatore intero * n1 e * n2.
  14. Assegnando alla variabile pointer * n1 un valore di 10.
  15. Assegnando alla variabile pointer * n2 un valore di 11.
  16. Fine del corpo del test di funzione ().

Anche se vengono assegnati nuovi valori alla variabile aeb all'interno del test della funzione, una volta completata la chiamata alla funzione, lo stesso non si riflette nella funzione esterna main.

L'uso dei puntatori come argomenti della funzione aiuta a passare l'indirizzo effettivo della variabile nella funzione e tutte le modifiche eseguite sulla variabile si rifletteranno nella funzione esterna.

Nel caso precedente, la funzione "test" ha l'indirizzo delle variabili "a" e "b". Queste due variabili sono direttamente accessibili dalla funzione "test" e quindi qualsiasi modifica apportata a queste variabili si riflette nella funzione chiamante "main".

Vantaggi dell'utilizzo dei puntatori

Di seguito sono riportati i vantaggi / vantaggi dell'utilizzo dei puntatori

  • I puntatori sono variabili che memorizzano l'indirizzo di altre variabili in C ++.
  • È possibile modificare e restituire più di una variabile dalla funzione utilizzando i puntatori.
  • La memoria può essere allocata e de-allocata dinamicamente utilizzando i puntatori.
  • I puntatori aiutano a semplificare la complessità del programma.
  • La velocità di esecuzione di un programma migliora utilizzando i puntatori.

Sommario:

  • Un puntatore si riferisce a una variabile che contiene l'indirizzo di un'altra variabile.
  • Ogni puntatore ha un tipo di dati valido.
  • Un puntatore è una rappresentazione simbolica di un indirizzo di memoria.
  • I puntatori consentono ai programmi di simulare call-by-reference e creare e manipolare strutture dati dinamiche.
  • Matrici e puntatori utilizzano un concetto correlato.
  • Il nome dell'array indica la base dell'array.
  • Se vuoi assegnare l'indirizzo di una matrice a un puntatore, non utilizzare una e commerciale (&).
  • Se non esiste un indirizzo specifico per assegnare una variabile puntatore, assegnargli un NULL.