Skip to content

Aritmetica dei Puntatori

I puntatori contengono indirizzi di memoria, ed è possibile usare la matematica (+ e -) direttamente su di essi. Questa è una delle feature più potenti e distintive del C, permettendo di navigare i buffer e gli array ad altissima velocità.

Quando sommi 1 a un puntatore, non stai aggiungendo un singolo byte all’indirizzo, ma stai dicendo al compilatore di spostarsi in avanti di un intero elemento. Il C “scala” automaticamente la matematica in base alla dimensione del tipo puntato. Questo comportamento è noto come Pointer Stride.

Se un int occupa 4 byte, e sommi +1 a un puntatore a int, l’indirizzo di memoria sottostante si sposterà effettivamente di 4 byte in avanti.

int arr[100];
int *ptr = &arr[0]; // Punta al primo elemento
ptr = ptr + 20; // Adesso punta all'elemento arr[20]

Puoi spostarti liberamente avanti e indietro all’interno dei limiti di un array. Il C garantisce anche che puoi creare un puntatore legale che punta esattamente uno spazio dopo l’ultimo elemento dell’array. Questo è noto come “too-far pointer”.

Tuttavia, puoi solo leggere l’indirizzo di questo puntatore too-far (spesso usato come condizione di fine ciclo). Tentare di dereferenziarlo (usare il * per leggerne il valore) causa Undefined Behavior.

Puoi sottrarre un puntatore da un altro puntatore, ma solo se entrambi puntano ad elementi dello stesso array. Il risultato non è la distanza in byte, ma il numero di elementi (Pointer Stride) che li separano. Il tipo restituito da questa operazione è ptrdiff_t (definito in <stddef.h>).

💻 Esercizio Pratico: Navigazione a Stride

Section titled “💻 Esercizio Pratico: Navigazione a Stride”

L’aritmetica dei puntatori è fantastica per scorrere gli array. Modifica l’esercizio per sommare 2 al puntatore in ogni ciclo, stampando così solo gli elementi nelle posizioni pari. Assicurati che la logica di avanzamento rifletta un “pointer stride” di +2 anziché +1.