Dispensa di Informatica – II.8
Dispensa II.8 versione 1.0 mail: lamonica@associatesonline.it Pagina 1 di 3
ARITMETICA DEI PUNTATORI
La dispensa di seguito proposta si pone come tutorial per poter porre le basi per la gestione di puntatori nel linguaggio C / C ++
Incremento dei puntatori
Il C consente di eseguire operazioni di somma e sottrazione su puntatori.
Supponendo che p e a forniscano l’indirizzo di memoria di elementi dello stesso tipo, p+i e a+i forniscono l’indirizzo di memoria dell’i-esimo elemento successivo di quel tipo (e non della locazione di memoria successiva !!!!)
Supponendo i una variabile intera:
la notazione a[i] è equivalente *(a+i);
supponendo p una variabile puntatore ad un intero (ad esempio tramite dichiaerazione int *p)
la notazione p = a è equivalente p = &a[0];
la notazione p = a+1 è equivalente a p = &a[1];
mentre non sono ammessi degli assegnamenti del tipo
a = p;
a = a +1;
(NON E’ POSSIBILE REDIRIGERE A CHE E’ IL PUNTATORE DEL PRIMO ELEMENTO DI UN ARRAY)
Dispensa di Informatica – II.8
Dispensa II.8 versione 1.0 mail: lamonica@associatesonline.it Pagina 2 di 3
Le stringhe
Si definisce stringa un array di char il cui ultimo elemento è il simbolo ‘\0’.
Supponiamo di dover misurare la lunghezza di una stringa.
/*algoritmo ERRATO per misurare la lunghezza di una stringa*/
char *stringa = “Il sale della vita”;
int len=0;
while( stringa++ != ‘\0’) // Errore!! STRINGA E’ IL PUNTATORE ++len;
printf(“Lunghezza stringa st=%d\n”,len);
/* algoritmo ERRATO per misurare la lunghezza di una stringa */
char *stringa = “Il sale della vita”;
int len=0;
while( *stringa++ != ‘\0’) // Errore!! NON POSSO MODIFICARE IL PUNTATORE stringa ++len;
printf(“Lunghezza stringa st=%d\n”,len);
/* algoritmo CORRETTO per misurare la lunghezza di una stringa */
char *stringa = “Il sale della vita”;
char *p;
int len=0;
p = stringa; // inizializzo p a puntare il primo elemento !!!
while( * p++ != ‘\0’) // Corretto !!!
++len;
printf(“Lunghezza stringa st=%d\n”,len);
Dispensa di Informatica – II.8
Dispensa II.8 versione 1.0 mail: lamonica@associatesonline.it Pagina 3 di 3
Operazioni con i puntatori
Supponendo che p e a forniscano l’indirizzo di memoria di elementi dello stesso tipo, ad esempio puntano a due diversi elementi di un array,
allora p–q restituisce un valore intero pari al numero di elementi esistenti tra l’elemento cui punta p e l’elemento cui punta q e NON LA DIFFERENZA TRA IL VALORE DEI PUNTATORI (INDIRIZZI) !!!!!!
Ad esempio Supponendo che il risultato di p–q sia pari a 3 e supponendo che ogni elemento dell’array sia memorizzato in 4 byte (un word in inglese, una parola in italiano) , allora la differenza tra l’indirizzo contenuto in p e l’indirizzo contenuto in q darebbe 12.