Когда вы пишете:
char * pmessage = "сейчас время";
Компилятор обрабатывает это так, как если бы вы написали:
const char internalstring[] = "now is the time";
char *pmessage = internalstring;
Причина, по которой вы не можете изменить строку, заключается в том, что если вы напишите:
char *pmessage1 = "now is the time";
char *pmessage2 = "now is the time";
Компилятор будет обращаться с ним так, как будто вы написали:
const char internalstring[] = "now is the time";
char *pmessage1 = internalstring;
char *pmessage2 = internalstring;
Итак, если бы вы поменяли один, вы бы поменяли оба.