Una delle applicazioni più semplici e utili dei puntatori è lo scambio del valore di due variabili. Normalmente, in una funzione, le variabili vengono passate per valore: la funzione lavora su copie e i dati originali non cambiano. Usando i puntatori, invece, possiamo modificare direttamente le variabili originali, perché passiamo alla funzione il loro indirizzo di memoria.
1️⃣ Il problema dello scambio
Consideriamo la funzione seguente, che tenta di scambiare due numeri:
void scambia(int a, int b) {
int temp = a;
a = b;
b = temp;
}
Se chiamiamo:
int x = 5, y = 10;
scambia(x, y);
cout << "x = " << x << " y = " << y;
Il risultato sarà:
x = 5 y = 10
❌ Non funziona!
Perché x e y vengono passate per valore → la funzione lavora su copie e non sulle variabili reali.
2️⃣ Soluzione con puntatori
Usiamo ora i puntatori per passare l indirizzo delle variabili:
void scambia(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
Ora la chiamata diventa:
int x = 5, y = 10;
scambia(&x, &y);
cout << "x = " << x << " y = " << y;
✅ Risultato:
x = 10 y = 5
Ora funziona, perché la funzione riceve gli indirizzi di x e y, e le modifica direttamente.
3️⃣ Spiegazione passo per passo
| Fase | Variabile | Valore | Indirizzo |
|---|---|---|---|
| 1 | x | 5 | 0x61ff0c |
| 2 | y | 10 | 0x61ff08 |
| 3 | a → *a | puntatore a 0x61ff0c → 5 | indirizzo di x |
| 4 | b → *b | puntatore a 0x61ff08 → 10 | indirizzo di y |
| 5 | temp | 5 | variabile temporanea nella funzione |
Durante l’esecuzione:
*ae*bsi riferiscono direttamente axey.- Scambiando
*ae*b, cambiano i valori delle variabili originali.
4️⃣ Programma completo
#include <iostream>
using namespace std;
void scambia(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
cout << "Prima dello scambio: x = " << x << " y = " << y << endl;
scambia(&x, &y);
cout << "Dopo lo scambio: x = " << x << " y = " << y << endl;
return 0;
}
✅ Output:
Prima dello scambio: x = 5 y = 10
Dopo lo scambio: x = 10 y = 5
5️⃣ Differenza con il passaggio per riferimento
In C++ moderno si può ottenere lo stesso effetto con i riferimenti (senza puntatori espliciti):
void scambia(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
La chiamata diventa:
scambia(x, y);
Risultato identico. Tuttavia, i puntatori restano essenziali per comprendere il funzionamento della memoria e dell’aritmetica degli indirizzi.
LABORATORIO
Scambio di due variabili con i puntatori
In questo laboratorio imparerai a scrivere e utilizzare una funzione che scambia i valori di due variabili passando i loro indirizzi come argomenti.
- Compilatore C++ (Code::Blocks, Dev-C++ o Visual Studio Code)
- Console per visualizzare i risultati
1 Scrivi la funzione di scambio
Crea una funzione void scambia(int* a, int* b) che scambia i valori puntati.
2 Prova la funzione nel main
Dichiara due variabili e passa i loro indirizzi alla funzione:
int x = 3, y = 8;
scambia(&x, &y);
3 Verifica i risultati
Stampa i valori prima e dopo la chiamata per verificare che siano stati scambiati.
4 Esercizi aggiuntivi
- Prova a scambiare variabili di tipo
floatochar. - Scrivi una versione generica della funzione (usando
template<typename T>). - Confronta la versione con puntatori e quella con riferimenti (
int &a, int &b).