Строка (константы) Указатель литералов - PullRequest
0 голосов
/ 21 февраля 2020

Я относительно новичок в C ++, и я искал ответ на свой вопрос, однако я запутался. Как я понимаю, строковые литералы должны указываться указателями «const», поскольку считаются доступными только для чтения. Я также понимаю, что сам указатель не является константой (и может быть изменен), но на самом деле он указывает на строковую константу. Я также понимаю, что сама строка не может быть изменена. Так в этом примере:

const char* cstr="string";
*cstr = 'a';

Я получаю сообщение об ошибке: «назначение места только для чтения». Теперь, если я определю свою C -строку следующим образом и определю указатель на нее, я смогу изменить строку:

char str[7]="string";
char* cstr = str;
*cstr = 'a';
cout << cstr <<endl;

строка будет изменена (output -> а), означает, что первый элемент строки является изменения. Мои два вопроса: 1- почему во втором примере я могу изменить строку C, но в первом случае я не могу внести какие-либо изменения в строку? 2- В обоих случаях я использую указатели, но в первом случае я должен использовать постоянный указатель на символ?

1 Ответ

1 голос
/ 23 февраля 2020

При использовании синтаксиса

const char* cstr="string";

C ++ определяет:

  • Массив из 7 символов в разделе памяти, доступном только для чтения, с содержимым string\0 в it.
  • указатель на стек (или на доступный для записи глобальный раздел памяти) с адресом этого массива.

Однако при использовании синтаксиса:

char str[7]="string";

C ++ определяет:

  • Массив из 7 символов в стеке (или в доступном для записи глобальном разделе памяти) с содержимым "string \ 0" в нем.

В первом случае фактические значения находятся в постоянной памяти, поэтому их нельзя изменить. Во втором случае они находятся в доступной для записи памяти (стековой или глобальной).

C ++ пытается применить эту семантику c, поэтому, если определение доступно только для чтения, вы должны использовать указатель const .

Обратите внимание, что не все архитектуры имеют память только для чтения, но поскольку большинство из них имеют, и C ++ может хотеть использовать функцию памяти только для чтения (для лучшей корректности), тогда Программисты C ++ должны предполагать (для целей типов указателей), что константы будут помещаться в постоянную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...