int *a è una variabile puntatore a intero. Ogni puntatore si aspetta di ricevere un indirizzo che tu gli passi con &a.
poi..proprio per la natura del puntatore facendo:
a = 10;
gli dici di puntare alla locazione di memoria numero 10, cosa che non si fa e che non vuoi neanche fare.
tu vuoi modificare il valore puntato, quindi devi agire dove punta il puntatore e lo fai con l'asterisco e quindi
*a = 10;