Aggiungo che quando assegni uno string literal (ovvero, una stringa tra virgolette) ad un puntatore, il puntatore in questione non dovrebbe essere un char *, ma un const char *, in modo che il compilatore ti segnali se cerchi di modificarlo.
In effetti il tipo degli string literal è const char *, ma la conversione a char * all'assegnamento è consentita per compatibilità con codice scritto quando ancora il C non aveva il const.