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.
Sfida
FacileScrivi 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:
- Dichiarare un array di interi chiamato
datacon 5 elementi e inizializzarlo con i valori {12, 24, 36, 48, 60} - Dichiarare un puntatore a un intero chiamato
ptre inizializzarlo affinché punti al primo elemento dell'array - Usare un ciclo for che venga eseguito 5 volte per attraversare l'intero array usando solo l'aritmetica dei puntatori
- All'interno del ciclo:
- Stampare il valore corrente a cui punta
ptrusando l'operatore di dereferenziazione - Stampare l'indirizzo di memoria contenuto in
ptrusando lo specificatore di formato%p - Incrementare il puntatore usando
ptr++per passare all'elemento successivo
- Stampare il valore corrente a cui punta
- Dopo il ciclo, reimpostare
ptraffinché punti di nuovo al primo elemento dell'array - Usare l'aritmetica dei puntatori per accedere direttamente al terzo elemento (indice 2) e stamparlo usando
*(ptr + 2) - 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: 60Questa 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;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online