Ah ok, ora ho capito. Quello che succede e' questo: tu nel primo ciclo "colleghi" la variabile $p ad un valore dell'array. Finito il ciclo, $p punta all'ultimo valore. Nel secondo ciclo invece usi $p "normalmente", cioe' sovrascrivi il suo valore senza modificare l'elemento a cui $p e' collegato, in questo modo ogni volta che assegni qualcosa a $p, quel qualcosa finisce nell'ultima cella dell'array (perche' e' li' che il primo ciclo l'ha lasciato).
Quando esegui il secondo ciclo, e' come se tu mettessi il valore di ogni elemento dell'array nell'ultima casella dell'array stesso, quindi l'array assume questi valori:
Non so se mi sono spiegato bene, mi sembrava molto piu' semplice prima di scriverlocodice:(uno)(due)(tre)(uno) \--------------/ (uno)(due)(tre)(due) \---------/ (uno)(due)(tre)(tre) \----/ (uno)(due)(tre)(tre) \/
Comunque, soluzione rapida: se proprio devi usare una reference nel primo, usa un altro indice nel secondo ciclo.