In questa lezione introdurremo l’aritmetica dei puntatori. Infatti, come abbiamo già detto i puntatori sono delle variabili particolari che contengono un indirizzo di memoria. Come sappiamo sugli indirizzi di memoria è possibile fare un accesso diretto.
Operazioni e aritmetica dei puntatori
Elenchiamo alcune operazioni con i puntatori:
La dereferenziazione
Della dereferenziazione ne abbiamo già discusso nella precedente lezione, ne riportiamo un esempio.
int *pa, a;
pa=&a;
L’assegnamento
Abbiamo già trattato l’assegnamento nella lezione precedente.
int *pa, *pb;
pb=pa;
o ancora un altro esempio:
int *pa=NULL;
In questo caso viene assegnato al puntatore pa il valore NULL, quindi restituisce il valore 0.
Ricordiamo che se un puntatore viene dichiarato ma non inizializzato non punta a NULL e restituisce il valore 1.
Il confronto
int *pa, *pb;
if (pa==pb);
….
else if (pa<pb)
….
Il confronto può essere utilizzato per vedere se due puntatori puntano alla stessa locazione di memoria.
Si possono utilizzare gli operatori:
==, !=, <, <=, >, >=
Operazioni di incremento e decremento
Incremento – Per andare da un indirizzo più basso ad uno più alto.
Decremento – Per andare da un indirizzo più alto ad uno più basso.
Quindi gli operatori ammessi per una variabile puntatore sono:
+, ++, -, —
Vediamo un semplice esempio a scopo didattico, ipotizzando di avere un array di 5 elementi qualunque. L’operazione di somma puntatore e intero in questo caso provoca un avanzamento del puntatore esattamente a quanto corrisponde l’intero. Allo stesso modo per la differenza, la sottrazione di un intero da un puntatore provoca uno spostamento del puntatore dall’alto verso il basso.
Cioè l’operazione p++ mi dà l’indirizzo della seconda cella, p+=2 mi dà l’indirizzo della terza cella e così via.
Esempio di utilizzo di aritmetica dei puntatori in C con gli operatori di incremento e decremento:
#include <stdio.h>
int main(void) {
int a[5]= {9,5,6,7,10};
int *p = &a[0];
printf("\nStampa il valore %d", *p);
//stampa il primo valore, cioè 9.
p++;
/*il puntatore si sposta dalla posizione più bassa
a quella più alta di una posizione. */
printf("\nStampa il valore %d", *p);
// quindi stamperà il valore 5.
p--;
/*il puntatore si sposta dalla posizione più alta
a quella più bassa di una posizione. */
printf("\nStampa il valore %d", *p);
// quindi stamperà il valore 9.
p += 2;
/*il puntatore si sposta dalla posizione più bassa
a quella più alta di due posizioni. */
printf("\nStampa il valore %d", *p);
// quindi stamperà il valore 6.
p += 2;
/*il puntatore si sposta dalla posizione più bassa
a quella più alta di due posizioni */
printf("\nStampa il valore %d", *p);
// quindi stamperà il valore 10.
return 0;
}
Fate anche la prova a stampare gli indirizzi e analizzate i risultati ottenuti.
int main(void) {
int a[5]= {9,5,6,7,10};
int *p = &a[0];
printf("\nStampa il valore %p", p);
p = p + 1;
printf("\nStampa il valore %p", p);
p--;
printf("\nStampa il valore %p", p);
p += 2;
printf("\nStampa il valore %p", p);
p += 2;
printf("\nStampa il valore %p", p);
return 0;
}
La sottrazione tra puntatori è definita solo quando entrambi i puntatori puntano ad elementi dello stesso array.
La sottrazione tra un puntatore e un altro produce il numero di posizioni tra i due puntatori.
Facciamo quindi un semplice esempio:
#include <stdio.h>
int main(void) {
int a[10];
int *p = &a[0];
int *q, d;
q = p;
p += 6;
d = p - q;
printf("Numero di interi che si possono memorizzare tra i due puntatori : %d ", d);
return 0;
}
Il programma mi dirà che si possono memorizzare tra i due puntatori 6 numeri interi.
In questa lezione abbiamo introdotto l’aritmetica dei puntatori, approfondiremo l’argomento ancora nelle prossime lezioni.
Alcuni link utili
Realizzare un menù di scelta in C
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice