Puntatori in C: Guida Completa
1. Cos’è un puntatore?
Un puntatore è una variabile che non contiene un valore, ma l’indirizzo di memoria di un’altra variabile.
- Ogni variabile occupa una zona di memoria; il tipo ne determina dimensione e interpretazione.
- Solo i puntatori contengono indirizzi di memoria.
Esempio:
int x = 10;
int *p = &x;
x→ variabile normale&x→ indirizzo di memoria dixp→ puntatore aintche contiene l’indirizzo dix
2. Visualizzazione in Memoria
| Indirizzo | Contenuto |
|---|---|
| 0x1000 | p = 0x2000 |
| … | … |
| 0x2000 | x = 10 |
pnon contiene 10, ma 0x2000 (l’indirizzo dix).
3. Operatori Fondamentali
a) Operatore & (address-of)
Restituisce l’indirizzo di una variabile.
&x // indirizzo di x
&p // indirizzo di p
b) Operatore * (dereferenziazione)
Restituisce il valore puntato dal puntatore.
*p // valore di x (10)
printf("%d", *p);→ stampa10
4. Modifica Tramite Puntatore
Modificando *p, si modifica direttamente x:
*p = 20;
- Ora
xvale20. - Potere dei puntatori: permettono di modificare dati indirettamente.
5. Tipi e Coerenza
Il tipo del puntatore deve corrispondere al tipo della variabile puntata:
int x;
int *p = &x; // OK
float *f = &x; // SBAGLIATO
- Il tipo dice al compilatore:
- Quanti byte leggere
- Come interpretare quei byte
6. Errori Tipici
- Puntatore non inizializzato:
int *p; *p = 10; // ERRORE: p non punta a niente - Dereferenziazione di NULL:
int *p = NULL; *p = 10; // ERRORE: dereferenziazione di NULL - Sempre inizializzare i puntatori prima dell’uso!
7. Puntatori e Funzioni
I puntatori permettono di modificare variabili esterne a una funzione. Esempio:
int add_two(int *n) {
*n = *n + 2;
return *n;
}
int main() {
int numero = 5;
add_two(&numero);
// Ora numero = 7
return 0;
}
- La funzione riceve l’indirizzo di
numeroe ne modifica il valore.
8. Puntatori e Stringhe
In C non esiste un tipo “stringa”: una stringa è un array di char terminato da \0.
a) Dichiarazione e Inizializzazione
char *s = "Hello";
spunta al primo carattere ('H').- La stringa in memoria:
H | e | l | l | o | \0
b) Aritmetica dei Puntatori
*s→'H's + 1→ punta a'e'- Si può scorrere la stringa fino a
\0.
c) Equivalenza
s == &s[0](entrambi puntano a'H').
9. Quando Usare i Puntatori?
- Modificare variabili indirettamente (es. in funzioni).
- Gestire array e stringhe in modo efficiente.
- Allocazione dinamica della memoria (es.
malloc,calloc). - Passare grandi strutture dati senza copiarle¹.
10.Scorrere una Stringa
#include <stdio.h>
int main() {
char *s = "Hello";
while (*s != '\0') {
printf("%c ", *s);
s++;
}
// Stampa: H e l l o
return 0;
}
¹ In C, quando passi una struttura a una funzione per valore, viene creata una copia della struttura, il che può essere inefficiente per strutture grandi. Per evitare questo, puoi passare un puntatore alla struttura.