Ваше понимание верно; char*
указывает на один char
.
Хитрость заключается в том, что массивы располагаются непрерывно в памяти, поэтому, учитывая указатель на первый элемент массива, вы можно получить доступ к другим элементам, просто добавив смещение к указателю. В вашем примере все выглядит (логически) так:
+-----+
| ptr |
+--+--+
|
v
+-+-+---+---+---+---+---+----+
| s | t | r | i | n | g | \0 |
+---+---+---+---+---+---+----+
ptr
указывает на 's'
в начале "string"
. Добавив 1
к ptr
, вы можете найти 't'
и так далее. Вот что делает (встроенный) оператор []
. ptr[2]
определено равным *(ptr + 2)
: смещение указателя на 2 позиции и выборка значения, на которое указывает результат.
Символ '\0'
используется для обозначения конца строка, чтобы потребительский код знал, что нужно перестать искать другие символы.