Что именно символ * означает в C ++? - PullRequest
3 голосов
/ 02 апреля 2020

Насколько я понимаю, он должен содержать адрес памяти переменной типа char, но теперь я вижу, что он может использоваться для создания строк? Например,

char* ptr = "string";

Как ptr может быть назначена строка, если она предназначена для хранения адреса памяти? Я думал, что оператор разыменования будет необходим, чтобы изменить значение, на которое указывает?

Ответы [ 2 ]

11 голосов
/ 02 апреля 2020

"string" - это const char[7] тип литерал . C ++ позволяет использовать кроличьи уши для упрощения языка. Для вас добавляется терминатор 0, поэтому существует 7 элементов, а не 6.

В различных случаях типы массивов decay для типов указателей, причем указатель установлен на первый элемент массива. Назначение является одним из таких случаев. И вот что здесь происходит.

Формально, начиная с C ++ 11 и далее, ваш компилятор C ++ не должен компилировать это утверждение. Это должно быть

const char* ptr = "string";
7 голосов
/ 02 апреля 2020

Ваше понимание верно; char* указывает на один char.

Хитрость заключается в том, что массивы располагаются непрерывно в памяти, поэтому, учитывая указатель на первый элемент массива, вы можно получить доступ к другим элементам, просто добавив смещение к указателю. В вашем примере все выглядит (логически) так:

+-----+
| ptr |
+--+--+
   |
   v
 +-+-+---+---+---+---+---+----+
 | s | t | r | i | n | g | \0 |
 +---+---+---+---+---+---+----+

ptr указывает на 's' в начале "string". Добавив 1 к ptr, вы можете найти 't' и так далее. Вот что делает (встроенный) оператор []. ptr[2] определено равным *(ptr + 2): смещение указателя на 2 позиции и выборка значения, на которое указывает результат.

Символ '\0' используется для обозначения конца строка, чтобы потребительский код знал, что нужно перестать искать другие символы.

...