Menu
Coddy logo textTech

Aritmetica dei puntatori

Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 9 di 63.

Hai imparato ad accedere agli elementi di un array usando la notazione con puntatori come *(array + i). Ora scoprirai una tecnica ancora più potente: l'aritmetica dei puntatori, che ti permette di spostare i puntatori in memoria usando semplici operazioni di incremento e decremento.

Quando incrementi un puntatore con ++ o lo decrementi con --, il puntatore non si sposta semplicemente di un byte. Invece, si sposta della dimensione del tipo di dati a cui punta. Per un puntatore a intero, ptr++ avanza di sizeof(int) byte, arrivando esattamente all'intero successivo in memoria.

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;    // Punta al primo elemento (10)
ptr++;                 // Ora punta al secondo elemento (20)
ptr++;                 // Ora punta al terzo elemento (30)

Questo calcolo automatico delle dimensioni è ciò che rende l’aritmetica dei puntatori così potente e comoda. Non devi preoccuparti dei calcoli dei byte: C gestisce l’indirizzamento della memoria per te in base al tipo di dati del puntatore.

L'aritmetica dei puntatori è particolarmente utile per scorrere gli array nei cicli. Invece di usare gli indici degli array, puoi incrementare un puntatore per spostarti in sequenza tra ciascun elemento, ottenendo spesso un codice più efficiente.

challenge icon

Sfida

Facile

Scrivi un programma C che dimostri l'aritmetica dei puntatori usando operazioni di incremento dei puntatori per attraversare ed elaborare un array. Il tuo programma dovrebbe:

  1. Dichiarare un array di interi chiamato data con 5 elementi e inizializzarlo con i valori {12, 24, 36, 48, 60}
  2. Dichiarare un puntatore a un intero chiamato ptr e inizializzarlo affinché punti al primo elemento dell'array
  3. Usare un ciclo for che venga eseguito 5 volte per attraversare l'intero array usando solo l'aritmetica dei puntatori
  4. All'interno del ciclo:
    • Stampare il valore corrente a cui punta ptr usando l'operatore di dereferenziazione
    • Stampare l'indirizzo di memoria contenuto in ptr usando lo specificatore di formato %p
    • Incrementare il puntatore usando ptr++ per passare all'elemento successivo
  5. Dopo il ciclo, reimpostare ptr affinché punti di nuovo al primo elemento dell'array
  6. Usare l'aritmetica dei puntatori per accedere direttamente al terzo elemento (indice 2) e stamparlo usando *(ptr + 2)
  7. Usare l'aritmetica dei puntatori per accedere direttamente all'ultimo elemento (indice 4) e stamparlo usando *(ptr + 4)

L'output dovrebbe mostrare i risultati nel seguente formato:

Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60

Questa sfida mette alla prova la tua comprensione di come le operazioni di incremento dei puntatori li spostino automaticamente di una quantità pari alla dimensione del tipo di dato e di come puoi usare l'aritmetica dei puntatori per accedere agli elementi dell'array a offset specifici rispetto alla posizione di un puntatore di base.

Provalo tu

#include <stdio.h>

int main() {
    // TODO: Scrivi qui il tuo codice
    // Dichiara e inizializza l'array 'data' con i valori {12, 24, 36, 48, 60}
    // Dichiara il puntatore 'ptr' e inizializzalo in modo che punti al primo elemento
    // Usa un ciclo for con l'aritmetica dei puntatori per scorrere l'array
    // Stampa ogni valore e indirizzo, poi incrementa il puntatore
    // Reimposta il puntatore e usa l'aritmetica dei puntatori per accedere a elementi specifici
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C online