Linguaggio C++

Swap Con Puntatori

Scambio del valore di due variabili utilizzando i puntatori in C++.

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:

  • *a e *b si riferiscono direttamente a x e y.
  • Scambiando *a e *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.


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 float o char.
  • Scrivi una versione generica della funzione (usando template<typename T>).
  • Confronta la versione con puntatori e quella con riferimenti (int &a, int &b).