const a sinistra di un tipo indica che la variabile in questione non può essere modificata.
Nei puntatori, la questione è un po' più complessa, dato che ci sono due cose che potrebbero essere "non modificabili": il puntatore stesso e i dati a cui punta. Per capire a cosa si riferisca il const, basta leggere la dichiarazione al contrario:
char * => puntatore (*) a dei char (char) => posso modificare sia il puntatore (ad esempio, rilocarlo e farlo puntare ad altro) sia i dati a cui punta (ovvero, modificare la stringa)
const char * => puntatore (*) a dei char (char) costanti (const) => è un puntatore che posso modificare, ma i dati a cui punta non possono essere modificati (la stringa a cui punta è costante)
char * const => puntatore costante (const *) a char => è un puntatore che non posso rilocare, ma posso modificare la stringa a cui punta
const char * const => puntatore cosante (const *) a char (char) costanti (cont) => né il puntatore né i dati a cui punta sono modificabili
In pratica, vedrai soltanto char * (stringa modificabile) e const char * (stringa non modificabile); nel caso degli string literal è fondamentale usare const char *, dato che lo standard dice che cercare di modificare uno string literal è "undefined behavior", che nella stragrande maggior parte dei casi si traduce in un crash del programma, dato che gli string literal sono memorizzati in un area di memoria di sola lettura.