Почему этот const char * не может быть изменен после его фактического изменения? - PullRequest
0 голосов
/ 04 марта 2019

Возьмите этот пример:

int main()
{
   const char* what = "Is This";
   what = "Interesting";
   cout << *what;
   what[3] = 'a'; // Sytax Error: expression must be a modifiable lvalue
   cout << *what;

   return 0;
}

Поэтому я объявляю what как const char*, и мне удалось переназначить ему другое значение (фактические данные в памяти, а не сам адрес памяти).

Но потом, это говорит мне, что я не могу изменить персонажа, который находится на 4-й позиции!

Почему это так?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

В этом коде what является неконстантным указателем на const char.

Вы можете изменить what, но вы не можете изменить *what.

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

const char *const what = "Is This";
// what is const
what = "Interesting"; // Error
// *what is also const
what[4] = 'x';        // Error

Если вам нужен константный указатель на неконстантный символ, запишите его в другом месте:

char isthis[] = "Is This";
char interesting[] = "Interesting";
char *const what = isthis;
// what is const
what = interesting; // Error
// *what is not const
what[4] = 'x';      // Ok
0 голосов
/ 04 марта 2019

const относится к указанным символам, а не к самому указателю!Таким образом, вы можете указать на любую C-строку, которую вы хотите, но не можете изменить символ этих строк.

Для простоты примера я буду использовать другой тип для иллюстрации точки (C-строковые литералы не могут быть изменены):

У вас на самом деле есть что-то вроде этого

const int i = 666;
const int j = 999;
const int *pi = &i;
pi = &j;
// *pi=444; is invalid, can't change the int pointed by pi

Вы можете создать указатель, который нельзя изменить, но указатель на int:

int i = 666;
int j = 999;
int *const pi = &i;
*pi = 999;
// pi = &j; is invalid, pi will always point to i

И затем вы можете смешать оба, никогда не меняйте ни указатель, ни указатель на int:

const int i = 666;
const int j = 999;
const int *const pi = &i;
// pi = &j; is invalid
// *pi = 444; is invalid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...