Por que meu char * é gravável e, às vezes, somente leitura em C ++

Eu tive grandes problemas para entender ochar* ultimamente. Digamos que eu fiz uma função recursiva para reverter umchar* mas, dependendo de como inicializá-lo, recebo algumas violações de acesso e, na minha cartilha C ++, não encontrei nada que me desse o caminho certo para entender, e estou buscando sua ajuda.

CASO 1 Primeiro caso em que tive violação de acesso ao tentar trocar cartas:

char * bob = "hello";

CASO 2 Então eu tentei isso para fazê-lo funcionar

char * bob = new char[5];
bob[0] = 'h';
bob[1] = 'e';
bob[2] = 'l';
bob[3] = 'l';
bob[4] = 'o';

CASO 3 Mas então, quando fiz uma cotação, recebi uma porcaria aleatória no final, então mudei para

char * bob = new char[6];
bob[0] = 'h';
bob[1] = 'e';
bob[2] = 'l';
bob[3] = 'l';
bob[4] = 'o';
bob[5] = '\0';

CASO 4 Isso funcionou, então eu disse a mim mesma por que isso não funcionaria então

 char * bob = new char[6];
 bob = "hello\0";

CASO 5 e falhou, eu também li em algum lugar que você poderia fazer algo como

char* bob[];

Em seguida, adicione algo a isso. Minha pergunta é por que alguns falham e outros não, e qual é a melhor maneira de fazê-lo?

questionAnswers(4)

yourAnswerToTheQuestion