Salve, volevo sapere sostanzialmente la differenza che c'è tra i seguenti codici:

codice:
#include <iostream>

using namespace std;

void scambia (int &, int & );

int main()
{
    int a = 5, b = 7;
    
    cout << a << " " << b << endl;
    
    scambia (a, b);
    
    cout << a << " " << b << endl;
    
    return 0;
}

void scambia (int &a, int &b)
{
     int c = a;
     
     a = b;
     b = c;
}
codice:
#include <iostream>

using namespace std;

void scambia (int *, int *);

int main()
{
    int a = 5, b = 7;
    
    cout << a << " " << b << endl;
    
    scambia (&a, &b);
    
    cout << a << " " << b << endl;
    
    return 0;
}

void scambia (int *a, int *b)
{
     int c = *a;
     
     *a = *b;
     *b = c;
}
svolgono lo stesso compito e se non erro entrambi operano sugli indirizzi delle variabili, ma di preciso qual'è la differenza?

Grazie in anticipo per le risposte