L'aritmetica dei puntatori è una caratteristica fondamentale del linguaggio C, che rende il lavoro con la memoria flessibile, ma potenzialmente pericoloso.
L'aritmetica dei puntatori è emersa a causa delle peculiarità dei linguaggi di basso livello ed è orientata a lavorare con array e a gestire i dati strutturati direttamente in memoria. In C tutti i puntatori "sanno" la dimensione del tipo a cui puntano.
Molti sviluppatori commettono l'errore di pensare che sommando uno a un puntatore l'indirizzo aumenterà esattamente di un byte. In realtà, l'incremento avviene di sizeof(tipo). Quando si lavora con diversi tipi di dati, specialmente con strutture di dimensioni diverse, è facile commettere errori durante le transizioni in memoria. Inoltre, l'aritmetica dei puntatori non è consentita con void* — questo è un errore standard.
Tutte le operazioni aritmetiche con i puntatori tengono conto della dimensione del tipo corrispondente, il che rende le operazioni con gli array massimamente efficienti. Ad esempio:
#include <stdio.h> int arr[4] = {10, 20, 30, 40}; int *p = arr; printf("%d ", *(p + 2)); // Restituisce 30
Qui (p + 2) sposta il puntatore di 2 * sizeof(int) byte in avanti, e non semplicemente di 2 byte.
Caratteristiche chiave:
È possibile eseguire operazioni di incremento/decremento con puntatori a void?
No, lo standard C vieta l'aritmetica con void*. È necessario prima convertire il puntatore a un tipo specifico, ad esempio (char*), e poi eseguire l'aritmetica.
void *vp = arr; char *cp = (char *)vp; cp++;
Cosa succede se si aggiunge a un puntatore a una struttura o a un array un valore superiore alla dimensione dell'array?
Questo porterà a un accesso oltre i limiti dell'area di memoria consentita (comportamento indefinito). C non controlla i limiti degli array — la responsabilità ricade sul programmatore.
È possibile sommare direttamente due puntatori tra loro?
No, la somma dei puntatori è vietata e non ha senso. È consentita solo la sottrazione di due puntatori appartenenti allo stesso array.
Un giovane sviluppatore, lavorando con un array di int attraverso i puntatori, spostava il puntatore di un numero fisso di byte, dimenticando la dimensione del tipo.
Vantaggi:
Svantaggi:
Un sviluppatore esperto usa sempre espressioni come (ptr + n), fidandosi del compilatore per scalare lo spostamento in base alla dimensione del tipo.
Vantaggi:
Svantaggi: