char rappresenta un singolo carattere, se vi assegni una costante tra apici singoli, il compilatore cerca di "interpretare" quello che metti tra apici come un carattere; se invece provi ad assegnare una costante tra doppi apici allora ti da errore.
char* rappresenta un puntatore ad un carattere che può essere il primo di una stringa...
il compilatore fa questo:
definisce un indirizzo di memoria e lo assegna alla variabile char*
a partire da tale indirizzo di memoria memorizza la tua stringa, un carattere alla volta
inserisce alla fine un carattere speciale '\0' che è il terminatore, in modo che le funzioni che lavorano su stringa sappiano quando questa è effettivamente finita.