Il motivo è prettamente pratico e serve per evidenziare i vari passaggi da fare. Un pò come identare il codice: serve agli uomini, non al compilatore.

Comunque il passaggio che fai è sbagliato.
Con:
codice:
*new_value = (int*) p;
a sinistra dell'uguale hai un intero (il puntatore dereferenziato), a destra hai un puntatore a int (ottenuto tramite cast).
Devi usare un paio di parentesi in più.
codice:
*new_value = *( (int*) p );