codice:
void funzione(int *p, int *p2){
     p2 = p;
}
semplicemente p e p2 sono passate per copia, qundi non puoi modificare il loro valore ma solo il valore da loro puntato... puoi fare per esempio *p1=*p2 o viceversa!!!

è come se facessi:
codice:
void funzione(int a, int b){
     a= b;  //???????????????????
}
i valori non vengono scambiati!

se vuoi scambiare gli oggetti puntati dai puntatori fai:
codice:
void funzione(int *&p, int *&p2){ //oggetti passati per riferimento
     p2 = p;
}