Вы изменяете указатель, который не является константой (вещь, на которую это указывает, константа).
, Если бы Вы хотите, чтобы сам указатель был константой, объявление было бы похоже:
char * const str = "something";
или
char const * const str = "something"; // a const pointer to const char
const char * const str = "something"; // same thing
указатели Константы на данные неконстанты обычно являются менее полезной конструкцией, чем указатель на константу.
Далее, как мы можем защитить str от того, чтобы быть измененным?
char * const str1; // str1 cannot be modified, but the character pointed to can
const char * str2; // str1 can be modified, but the character pointed to cannot
const char * const str3 // neither str3 nor the character pointed to can be modified.
самый легкий способ считать это состоит в том, чтобы начать с имени переменной и читать налево:
ПРИМЕЧАНИЕ: справа налево чтение не работает в общем случае, но для простых объявлений это - простой способ сделать это. Я нашел апплет Java на основе кода с "Языка программирования C", который может дешифровать объявления с полным объяснением того, как сделать это.
На связанной ноте определенно смотрите на" указатель константы по сравнению с указателем на константу ". Помогает с тем, что некоторые люди называют правильность константы . Я сохраняю его в своих закладках так, чтобы я мог обратиться к нему время от времени.
То, что Вы ищете, может быть синтаксисом...
const char* const str = NULL;
str = "test";
str = "test2";
Уведомление "константа" после символа*, который приводит к ошибке компилятора при попытке компилировать/создавать.
Память для строковых литералов выделяется на стеке, и все Ваши присвоения делают изменение str
указатель для указания на те адреса памяти. Постоянный символ, на который это указало первоначально, не изменился вообще.
Кроме того, объявляя переменную, поскольку константа означает, что переменная только для чтения; это не означает, что значение является постоянным!