Aritmetica dei puntatori
Nei linguaggi di programmazione, l'espressione aritmetica dei puntatori si riferisce a un insieme di operazioni aritmetiche applicabili sui valori di tipo puntatore. Tali operazioni hanno lo scopo di consentire un alto livello di flessibilità nell'accesso a collezioni di dati omogenei conservati in posizioni contigue della memoria (per esempio array). L'aritmetica dei puntatori è tipica del linguaggio C ed è stata mantenuta in alcuni linguaggi derivati (è presente per esempio in C++ ma non in Java).
Aritmetica dei puntatori nel linguaggio C
modificaL'aritmetica dei puntatori del C è basata su tre operatori fondamentali, accompagnati da un certo numero di altri operatori la cui semantica è derivata da quella degli operatori principali:
+
: operatore binario di somma di un puntatore e un intero- derivato:
++
: operatore unario di autoincremento di un puntatore - derivato:
+=
: operatore di assegnamento con somma
- derivato:
-
: operatore binario di differenza fra due puntatori-
: operatore binario di sottrazione di un intero da un puntatore- derivato:
--
: operatore unario di autodecremento di un puntatore - derivato:
-=
: operatore di assegnamento con differenza
- derivato:
Operatore di somma di un puntatore e un intero
modificaDefinizione
modificaL'operatore di somma di puntatore e intero richiede un operando di tipo puntatore e un operando di tipo intero. Il risultato della somma è l'indirizzo dato dal puntatore incrementato del risultato della moltiplicazione dell'intero specificato per la dimensione (sizeof
) del tipo base del puntatore espressa in byte. Per esempio, se p
è un puntatore al tipo intero int
(int *p
) di valore 1000 (p=1000
), e se la dimensione di un int
è due byte, p+1
vale 1002, p+2
vale 1004, e in generale p+n
vale 1000+n*2.
Significato
modificaL'operazione di somma fra puntatore e intero è significativa nel caso in cui il puntatore contenga l'indirizzo di una cella di un array di dati del tipo base del puntatore. Infatti, se p
(puntatore a intero) contiene l'indirizzo della prima cella di un array di interi, p+1
produce l'indirizzo della seconda cella, p+2
l'indirizzo della terza, e via dicendo. L'aritmetica dei puntatori quindi introduce una sintassi alternativa rispetto a quella tradizionale (basata su indicizzazione) per accedere agli elementi di un array.
Operatore di differenza fra due puntatori
modificaDefinizione
modificaL'operatore di differenza fra puntatori richiede due operandi entrambi di tipo puntatore, aventi tipo base omogeneo (per esempio due puntatori a intero, due puntatori a carattere, e via dicendo). Il risultato della differenza è la differenza aritmetica fra i due indirizzi specificati dai puntatori, divisa per la dimensione del tipo base. Per esempio, se p
contiene 1002 e q
contiene 1000, ed entrambi sono puntatori a int
, e la dimensione degli int
è 2, allora q-p
vale 1.
Significato
modificaL'operazione di differenza fra puntatori è significativa se i due operandi contengono gli indirizzi di due celle diverse del medesimo array, e se il tipo base dell'array coincide con quello dei due puntatori. In questo caso, infatti, la differenza fra i due puntatori corrisponde al numero di celle dell'array che separano la cella puntata dal puntatore di valore minore da quella del puntatore di valore maggiore.
Operatore di sottrazione di un intero da un puntatore
modificaDefinizione
modificaL'operazione di sottrazione di un intero da un puntatore prevede un operando sinistro di tipo puntatore e un operando destro di tipo intero. Il risultato (analogamente al caso della somma) è il valore del puntatore decrementato del risultato della moltiplicazione dell'intero per la dimensione del tipo base del puntatore. Per esempio, se p
è un puntatore a int
di valore 1000, e la dimensione di un int
è 2, p-1
vale 998.
Significato
modificaSotto le stesse condizioni descritte sopra per la somma, l'operazione di sottrazione di un intero da un puntatore consente di ricavare l'indirizzo di una cella di un array precedente a quella puntata dal puntatore su cui viene applicata la sottrazione.
Operatore di autoincremento e autodecremento di un puntatore
modificaNel linguaggio C, le operazioni di autoincremento e autodecremento di un puntatore, come quelle di autoincremento e autodecremento di numeri interi, rappresentano una forma particolare di somma e sottrazione. Esse sono definite dal seguente effetto:
x++
incrementax
di 1, e produce il valore dix
prima dell'incremento++x
incrementax
di 1, e produce il valore dix
dopo l'incrementox--
decrementax
di 1, e produce il valore dix
prima del decremento--x
decrementax
di 1, e produce il valore dix
dopo il decremento
Tenute ferme queste definizioni, il significato di questi operatori nel caso il loro operando sia un puntatore si ricava dalla definizione di somma di puntatore e intero e di sottrazione di un intero da un puntatore.
Altri operatori
modificaLe regole descritte sopra si applicano in C anche ad altri due operatori, definiti in termini degli operatori +
e -
:
p+=n
corrisponde ap=p+n
p-=n
corrisponde ap=p-n
Nota sull'overloading
modificaTutti gli operatori descritti sopra hanno, in C e nei linguaggi derivati, un significato anche nel caso gli operandi siano dati numerici non di tipo puntatore. Il fatto che lo stesso simbolo acquisisca significati (leggermente) diversi in funzione del tipo dei suoi operandi può considerarsi un caso di overloading degli operatori.