Edizione didattica italiana
Puntatori in C
Impara indirizzi, dereferenziazione, limiti e durata degli oggetti.

Un puntatore contiene un indirizzo associato a un tipo. & ottiene l’indirizzo di un oggetto e * accede all’oggetto puntato. Prima di dereferenziare, verifica che l’oggetto esista e che tipo e durata siano compatibili.
L’aritmetica dei puntatori procede in unità del tipo puntato. Puoi formare un puntatore subito dopo la fine di un array, ma non dereferenziarlo. Sottrazioni e confronti d’ordine devono rispettare le regole sugli elementi dello stesso array.
Passare un puntatore ne copia il valore. Puoi modificare l’oggetto attraverso la copia, ma cambiare la copia non cambia il puntatore del chiamante. Restituisci il nuovo puntatore o usa un puntatore a puntatore per aggiornarlo.
Inizializza i puntatori, controlla le allocazioni e non accedere dopo free. Disegnare oggetti e frecce aiuta a capire liste e array di puntatori.
Codice sorgente
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main(void) {
int score = 95;
int *ptr = &score;
printf("Value via ptr : %d\n", *ptr);
*ptr = 100;
printf("Updated score : %d\n", score);
int nums[4] = {10, 20, 30, 40};
int *p = nums;
for (int i = 0; i < 4; i++) {
printf("*(p + %d) = %d\n", i, *(p + i));
}
printf("Bytes between p and p + 1: %zu\n",
(size_t)((char *)(p + 1) - (char *)p));
int x = 1, y = 2;
swap(&x, &y);
printf("After swap: x = %d, y = %d\n", x, y);
int *heap = malloc(3 * sizeof(int));
if (heap == NULL) {
return 1;
}
for (int i = 0; i < 3; i++) {
heap[i] = (i + 1) * 5;
}
printf("Heap values: %d %d %d\n", heap[0], heap[1], heap[2]);
free(heap);
heap = NULL;
printf("heap is %s after free\n", heap == NULL ? "NULL" : "not NULL");
return 0;
}
Apri nel compilatoreRisultato atteso
Value via ptr : 95 Updated score : 100 *(p + 0) = 10 *(p + 1) = 20 *(p + 2) = 30 *(p + 3) = 40 Bytes between p and p + 1: 4 After swap: x = 2, y = 1 Heap values: 5 10 15 heap is NULL after free
Domande frequenti
Perché il codice e alcuni risultati restano in inglese?
Parole chiave C, identificatori, commenti del programma e output attesi restano quelli originali per preservare codice eseguibile e test coerenti. Spiegazioni e istruzioni sono tradotte.