Puntatori in C

Scopriamo cosa sono i puntatori e quale vantaggio ci porta il loro utilizzo.

Cos’è un puntatore?

Un puntatore è una variabile che al suo interno contiene un indirizzo di memoria di un’altra variabile.

puntatore c ad una variabile int

Per dichiarare una variabile come puntatore dobbiamo mettere l’asterisco prima del suo nome.

dichiarazione e assegnazione di un puntatore c

Introduciamo due nuovi operatori: l’operatore di riferimento e l’operatore di dereferenziazione.

  • L’operatore di riferimento * permette di modificare il valore della variabile alla quale si sta puntando.
  • L’operatore di dereferenziazione & permette di ottenere l’indirizzo di memoria di una variabile.
operatori di riferimento e 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!

Array e puntatori

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
puntatore C ad un array

Struct e puntatori

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
puntatore C ad una struct