La memoria di un calcolatore la possiamo immaginare come una grande scacchiera, un insieme di celle che possono contenere informazioni. In questo casellario ogni cella è identificata da un indirizzo, cioè un numero intero che la distingue dalle altre celle. Quando il programma deve recuperare un dato, deve conoscere la sua posizione. Nella figura sotto viene rappresentata una piccola memoria da 100 celle, ognuna col suo indirizzo di cella. Dentro ogni cella ci può essere un dato, che può essere un numero, un carattere, un simbolo….ecc.

0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 . . . . . .
30 . . 33 34 35 36 . . .
40 . . . . . . . . .
50 . . . . . . . . .
60 . . . . . . . . .
70 . . . . . . . . .
80 . . . . . . . . .
90 . . . . . . . . 99

I puntatori sono variabili che non contengono numeri interi o caratteri o altri tipi di dato… contengono indirizzi di celle di memoria.

Nella figura, il puntatore contiene l’indirizzo 51003, cioè punta alla cella di memoria 51003 che contiene un dato. I puntatori quindi sono numeri interi, come gli indirizzi delle celle di memoria.

un puntatore si dichiara con la seguente espressione:

int *nomepuntatore;

si utilizza quindi il simbolo “*” e la stessa dichiarazione di tipo per i numeri interi.

Se invece ho una variabile “a” per considerare l’indirizzo della cella dove viene salvato il dato contenuto in “a” si usa il simbolo “&” e questa altra espressione:

&a;

Quindi ora sappiamo come dichiarare una variabile che contiene indirizzi di memoria (il puntatore) e come ottenere l’inidirzzo di memoria di una qualunque variabile. L’istruzione sotto vuol dire allora che assegno al puntatore nomepuntatore l’indirizzo della cella contenente “a”.

nomepuntatore = &a;

L’istruzione sotto inserisce il dato “100” nella cella puntata .

*nomepuntatore = 100;

Esempi:

  1. int *miopuntatore;  // creo una variabile di tipo puntatore
  2. int a= 100;
  3. miopuntatore = &a;

In questo esempio creo una variabile *miopuntatore di tipo puntatore a cella di memoria, poi creo una variabile intera “a” e le assegno il valore “100”, infine assegno al puntatore l’indirizzo della cella relativa alla variabile “a”. Il risultato è che *miopuntatore=100;

Nell’esempio che segue il risultato delle istruzioni è che a=200.

  1. int *miopuntatore;
  2. int a= 100;
  3. miopuntatore = &a;
  4. *miopuntatore = 200;

Puntatori a vettori.

Posso usare un puntatore anche per individuare una cella di un vettore. L’istruzione sotto assegna al puntatore l’indirizzo della cella “0” del vettore.

ptr = &vettore[0];

 

Progetti in Tinkercad.

Progetto uno: dichiara una variabile intera e poi un puntatore, assegna al puntatore l’indirizzo della variabile e visualizzalo sul monitor seriale. Cambia ora a cui punta il puntatore e verifica che cambia anche il valore della variabile.

Progetto due: crea anche qui un puntatore ed una variabile intera e verifica che incrementando il primo, incrementi il secondo e viceversa. visualizza il tutto sul monitor seriale.

Progetto 3: utilizza un LCD e crea un vettore di 10 numeri interi a cui assegna subito il valore da programma. Crea un puntatore alla cella generica “i” del vettore. Visualizza il vettore sul primo rigo del LCD poi sul secondo rigo, incrementando il valore di “i”, visualizza il valore del dato contenuto nella cella del vettore e quello puntato dal puntatore (che coincidono).