Debido a la siguiente definición:
Entonces, queda claro que a es un puntero doble "int **a". Además, también tenemos que según la definición de "p":
"p" es también un puntero doble.
Entonces:
* a[0] obtiene la posición de memoria donde empieza la primera fila
* &a[0] obtiene un puntero doble
* p = &a[0] asignas un puntero doble a otro puntero doble.
La asignación, como puedes ver, es correcta.
Un saludo.