Почему я могу изменить значение символа константы* переменная?

23
задан MaxVT 17 May 2011 в 10:51
поделиться

6 ответов

Вы изменяете указатель, который не является константой (вещь, на которую это указывает, константа).

, Если бы Вы хотите, чтобы сам указатель был константой, объявление было бы похоже:

char * const str = "something";

или

char const * const str = "something";  // a const pointer to const char
const char * const str = "something";  //    same thing

указатели Константы на данные неконстанты обычно являются менее полезной конструкцией, чем указатель на константу.

36
ответ дан Michael Burr 29 November 2019 в 01:25
поделиться

Далее, как мы можем защитить 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.

самый легкий способ считать это состоит в том, чтобы начать с имени переменной и читать налево:

  • str1 константа муравей указатель к символ агент
  • , str2 указатель к символ агент константа муравей
  • , str3 константа муравей указатель к символ агент константа муравей

ПРИМЕЧАНИЕ: справа налево чтение не работает в общем случае, но для простых объявлений это - простой способ сделать это. Я нашел апплет Java на основе кода с "Языка программирования C", который может дешифровать объявления с полным объяснением того, как сделать это.

13
ответ дан Matthew Crumley 29 November 2019 в 01:25
поделиться

На связанной ноте определенно смотрите на" указатель константы по сравнению с указателем на константу ". Помогает с тем, что некоторые люди называют правильность константы . Я сохраняю его в своих закладках так, чтобы я мог обратиться к нему время от времени.

2
ответ дан 2 revsAnthony Cuozzo 29 November 2019 в 01:25
поделиться

То, что Вы ищете, может быть синтаксисом...

const char* const str = NULL;
str = "test";
str = "test2";

Уведомление "константа" после символа*, который приводит к ошибке компилятора при попытке компилировать/создавать.

1
ответ дан Rob Segal 29 November 2019 в 01:25
поделиться

Память для строковых литералов выделяется на стеке, и все Ваши присвоения делают изменение str указатель для указания на те адреса памяти. Постоянный символ, на который это указало первоначально, не изменился вообще.

1
ответ дан Joel Coehoorn 29 November 2019 в 01:25
поделиться

Кроме того, объявляя переменную, поскольку константа означает, что переменная только для чтения; это не означает, что значение является постоянным!

1
ответ дан Kieran Tully 29 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: