Consejos de programación, pequeños ejemplos
p es un puntero y el valor almacenado es la dirección de la variable. &b es obtener la dirección de la variable b, entonces p = &b es asignar un valor al puntero, lo que significa que p apunta a b. *p = a significa asignar el valor de a a la variable señalada por p, es decir, b. Entonces, al final, el valor de p sigue siendo la dirección de b, y el valor de b se vuelve igual a a (5).