Указатели - это специальный тип переменных, используемый для хранения адресов других переменных. когда вы меняли значение внутри указателя str с помощью «str ++», оно затем указывало на следующий элемент, а после цикла while str указывало на последний элемент строки ('\ 0'). Таким образом, вы должны сохранить адрес первого символа строки, чтобы что-то сделать с ним позже.
int main() {
char *s = "abcde", *str =s; // s,str stores address of first character
while(*str!='\0'){
if(*str ==' ')
*str='-';
printf("%c", *str);
str= str+1; // str now points to the next character. But s remains unchanged
}
}