Indirizzi in memoria
La RAM è fatta di celle, ognuna con un proprio indirizzo (un numero, scritto in esadecimale, es. 0x0000AAAA). Una variabile occupa una cella. Un puntatore è una variabile che contiene l'indirizzo di un'altra variabile.
- &x — l'operatore indirizzo di: restituisce dove si trova x.
- int *p — dichiara p come puntatore a int.
- *p — l'operatore di dereferenziazione: il valore puntato da p.
int x = 42; int *p = &x; // p riceve l'indirizzo di x cout << x; // 42 (il valore) cout << &x; // 0x0000AAAA (l'indirizzo) cout << *p; // 42 (il valore puntato) *p = 100; // modifica x passando dal puntatore cout << x; // 100
Per valore o per riferimento
Quando passi una variabile a una funzione puoi farlo in due modi, con conseguenze opposte sulla memoria.
Passaggio per valore (copia)
La funzione riceve una copia del valore, in una cella diversa (indirizzo diverso). Le modifiche restano dentro la funzione: la variabile originale non cambia.
void raddoppia(int n) { // n e' una COPIA n = n * 2; // modifica solo la copia } int x = 5; raddoppia(x); cout << x; // stampa 5 (invariato!)
Passaggio per riferimento / indirizzo
La funzione lavora sulla stessa cella dell'originale (tramite un riferimento & o un puntatore *). Le modifiche restano anche fuori dalla funzione.
Riferimento (&)
Puntatore (*)
Gli esercizi
Base: indirizzi, dereferenziazione, scambio e passaggio per riferimento. Avanzati: aritmetica dei puntatori, struct per puntatore e funzioni che restituiscono più valori (10 esercizi ciascuna).