Lezioni del modulo (2/2)
Puntatori
I puntatori sono una delle caratteristiche più potenti e distintive del C++. Permettono di accedere direttamente alla memoria fisica del computer, consentendo una gestione efficiente delle risorse e prestazioni elevate.
1. Cos'è la Memoria e un Indirizzo?
Ogni variabile che dichiari nel tuo programma viene memorizzata in una cella della memoria RAM. Ogni cella ha un indirizzo di memoria univoco (solitamente espresso in formato esadecimale, es. 0x7ffee3bf87ac).
C++ ci permette di ottenere l'indirizzo di memoria di qualsiasi variabile usando l'operatore di indirizzo &:
int x = 42;
std::cout << &x; // Stampa l'indirizzo di memoria di x (es. 0x7ffee3bf87ac)
2. Definizione di Puntatore
Un puntatore è una variabile speciale che memorizza come valore l'indirizzo di memoria di un'altra variabile.
La sintassi prevede l'uso dell'asterisco * dopo il tipo di dato:
int x = 42;
int* ptr = &x; // ptr è un puntatore a intero che contiene l'indirizzo di x
3. L'Operatore di Dereferenziazione (*)
Per accedere o modificare il valore memorizzato all'indirizzo a cui punta un puntatore, utilizziamo l'operatore di dereferenziazione (o indirezione), anch'esso rappresentato dal simbolo *:
int x = 42;
int* ptr = &x;
std::cout << *ptr; // Stampa 42 (il valore a cui punta ptr)
*ptr = 100; // Modifica il valore di x tramite il puntatore
std::cout << x; // Ora stampa 100!
4. Puntatori Nulli: nullptr
Un puntatore che non punta a nessun indirizzo valido deve essere inizializzato con la parola chiave nullptr (introdotta in C++11):
int* ptr = nullptr; // Puntatore nullo e sicuro
Prova tu
Nel main è presente una variabile value inizializzata a 42. Dichiara un puntatore a intero ptr che punta all'indirizzo di value. Utilizza la dereferenziazione di ptr per impostare il valore di value a 100, infine stampa value usando std::cout.
Mostra suggerimento
Dichiara il puntatore con `int* ptr = &value;`, modifica il valore dereferenziando `*ptr = 100;`, e stampa `std::cout << value;`.
Soluzione disponibile dopo 3 tentativi
Definisci una funzione doubleValue che accetta un puntatore a intero (int* ptr) e moltiplica per 2 il valore a cui punta (se il puntatore non è nullo). Nel main, chiama doubleValue passandole l'indirizzo della variabile num e stampala.
Mostra suggerimento
La funzione deve accettare `int* ptr`. All'interno, usa `*ptr = (_ptr) _ 2`. Nel main chiamala con `doubleValue(&num);`.
Soluzione disponibile dopo 3 tentativi
Dato il codice riportato, quale espressione permette di modificare direttamente il valore di a impostandolo a 10?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?