В C и C++ строки, определенные как литералы, имеют статическое (неизменяемое) хранение. Это означает, что литералы строк, такие как `"hello"`, размещаются в области памяти, которая не предназначена для изменения. Попытка изменить содержимое такой строки может привести к неопределенному поведению вашей программы, включая возможное падение.
Когда вы пишете:
```cpp
char* hello = "hello"; // ошибка, перед char* должен быть const
```
в этом случае вы хотите присвоить указатель на строковый литерал переменной типа `char*`. Однако строка `"hello"` хранится в памяти только для чтения, и попытка изменить ее содержимое (например, присвоить `hello[0] = 'H';`) приведет к ошибке выполнения.
Чтобы разрешить этот код и избежать ошибок, вы можете использовать `const char*`, что означает, что указатель указывает на неизменяемые данные:
```cpp
const char* hello = "hello";
```
Это также информирует компилятор и других разработчиков о том, что указатель `hello` не должен изменять строку, на которую он указывает.
Если вы хотите создать изменяемую строку, вы можете делать это, используя массив символов:
```cpp
char hello[] = "hello"; // создается массив, в который копируется строка
```
В этом случае строка "hello" будет скопирована в автоматически выделенный массив `hello`, который можно изменять. Теперь вы можете изменять содержимое массива, например:
```cpp
hello[0] = 'H'; // теперь hello будет "Hello"
```
Итак, резюмируя:
- Строковые литералы в C/C++ являются неизменяемыми.
- Указатели на строки, объявленные как `char*`, не могут указывать на неизменяемые литералы, если они не объявлены с `const`.
- Если вам нужна изменяемая строка, используйте массив символов (`char[]`).