Задать вопрос

Почему string — это char*?

Встречный вопрос на Чем отличается char* от int*, float* и других в Си? .
Насколько я знаю, string - это символьная строка (много символов, короче говоря).
Char - это один символ, символьный тип. Очевидно, что для string памяти нужно в разы больше. Так почему char* - это string, и зачем тут звёздочка (*) ?
  • Вопрос задан
  • 4773 просмотра
Подписаться 3 Оценить 1 комментарий
Решения вопроса 1
Я так понял, что std::string не имелся в виду.
То есть суть вопроса такова: почему строки передают как char*, хотя это тип указателя на один char.

Дело в том, что массивы в C нельзя передавать как параметр функции, указатель на массив нельзя сохранить.
В результате массив, например char[8], принято передавать как указатель на его первый элемент: char*. Более того, при передаче массива в функцию он автоматически разлагается (decays) до указателя на первый элемент.

Остальные элементы получаются при помощи адресной арифметики: *(p+3) или p[3], что одно и то же. Итак, указатель в коде C может указывать как на одну переменную, так и на целый массив (точнее, его начало).

Для массивов int или любого другого типа обычно вместе с указателем на первый элемент передают размер массива. Но строки C завершаются нулевым символом, поэтому здесь длина известна и так. Вот и получается, что char* используют вместо char[N].

Edit: На самом деле, в C можно объявить указатель на массив:
int (*arr)[10] = malloc(sizeof(*arr) * 5);
Не помню, чтобы я видел такую конструкцию в реальном коде.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
severus256
@severus256
Code everywhere....
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы