Nel primo caso staresti assegnando al indirizzo puntato da Ptr il valore di a (però Ptr non è stato inizializzato, quindi può puntare ad un indirizzo a caso oppure a NULL, a seconda del compilatore, quindi quell'assegnazione darà errore al 99% dei casi. Prima di utilizzare Ptr quindi gli devi dare un indirizzo a cui puntare, che può essere una variabile come a, oppure uno spazio di memoria allocato dinamicamente con una malloc/calloc).
Nel secondo caso invece assegni a Ptr l'indirizzo di a, quindi ogni volta che userai *Ptr accederai al valore di a. In questo caso sì che puoi ora scrivere *Ptr = a qualcosa, poiché Ptr è stato inizializzato e punta ad un indirizzo valido.