Scopriamo cosa sono i puntatori e quale vantaggio ci porta il loro utilizzo.
Un puntatore è una variabile che al suo interno contiene un indirizzo di memoria di un’altra variabile.
Per dichiarare una variabile come puntatore dobbiamo mettere l’asterisco prima del suo nome.
Introduciamo due nuovi operatori: l’operatore di riferimento e l’operatore di dereferenziazione.
Scriviamo un semplice programma di esempio per vedere come agiscono i puntatori.
#include <stdio.h>
int main(){
//DICHIARO DUE VARIABILI
int n1 = 100;
int n2 = 200;
//DICHiARO UN PUNTATORE A n1
int *p = &n1;
//CAMBIO IL VALORE DI n1
*p = 101;
//ASSEGNO IL PUNTATORE A n2
int *p = &n2;
//CAMBIO IL VALORE DI n2
*p = 400;
//STAMPO IL VALORE DELLE VARIABILI
printf("n1: %d \n",n1);
printf("n2: %d \n",n2);
return 0;
}
L’output di questo programma è il seguente:
n1: 101
n2: 400
Il puntatore p ha modificato i valori delle variabili n1 e n2. Con una sola variabile siamo riusciti a modificarne due!
Le variabili di tipo array sono anch’esse puntatori. Poiché un array sono un insieme di variabili contigue in memoria è possibile richiamare un elemento di un array anche con un classico puntatore.
#include <stdio.h>
int main(){
int arr[3];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
//DICHIARO UN PUNTATORE AL PRIMO ELEMENTO DELL'ARRAY
int *p = &arr[0];
//CAMBIO IL VALORE DEL PRIMO ELEMENTO DELL'ARRAY
*p = 20;
//PUNTO AL PROSSIMO ELEMENTO
p = p + 1;
//CAMBIO IL VALORE DEL SECONDO ELEMENTO
*p = 100;
//STAMPO L'ARRAY
int i=0;
while(i < 3){
printf("Elemento %d: %d",i,arr[i]);
}
return 0;
}
Elemento 0: 20
Elemento 1: 100
Elemento 2: 2
Siccome anche le struct sono variabili, sarà possibile utilizzare i puntatori anche con esse, sostituiremo però l’operatore . con l’operatore ->.
#include <stdio.h>
typedef struct {
int x;
int y;
} punto;
int main(){
punto p1;
punto *puntatore = &p1;
puntatore->x=10;
puntatore->y=20;
printf("X: %d",puntatore->x);
printf("Y: %d",p1.y);
return 0;
}
X: 10
Y: 20