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]Il “Too-Far Pointer” (Un passo oltre)
Section titled “Il “Too-Far Pointer” (Un passo oltre)”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.
Differenza tra Puntatori
Section titled “Differenza tra Puntatori”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.