Sto studiando il passaggio di argomenti a funzioni come puntatori e l'analogia col passaggio per indirizzo delle variabili, cosa c'è di errato in questo codice? La compilazione va a buon fine ma il run si blocca dopo aver stampato a video una sequenza numerica:

codice:
#include <iostream>

using namespace std;

void scambia1(int &a, int &b)
{
    int appo;
    appo=a;
    a=b;
    b=appo;

    return;
}

void scambia2(int *a, int *b)
{
    int appo;
    appo= *a;
    *a= *b;
    *b= appo;
}

int main()
{
    int num1=5, num2=7;
    int *p1, *p2;
    p1=&num1;
    p2=&num2;

    cout<<num1;
    cout<<num2;

    scambia1(num1, num2);
    cout<<num1;
    cout<<num2;

    scambia2(*p1,*p2);
    cout<<num1;
    cout<<num2;

    return 0;
}