0

пример кода:

char *array = "привет";
cout << array;

Почему выводится все слово, а не первая буква?

  • Мощный код. Что сделать? – AR Hovsepyan Oct 09 '19 at 14:10
  • 1
    Ну во-первых этот код невалиден, в С++ нельзя преобразовать строковый литерал к указателю на char. А во-вторых непонятно, почему вы ожидаете, что выведется просто "п" – user7860670 Oct 09 '19 at 14:13
  • Данный вопрос следует закрыть, потому что никак не поможет будущим посетительям или вызвать интерес – AR Hovsepyan Oct 09 '19 at 14:26
  • Откуда возник такой вопрос? С чего бы это вдруг стала выводиться первая буква вместо всего слова? – AnT stands with Russia Oct 09 '19 at 14:28
  • Типа указатель на первый элемент – Razor0109 Oct 09 '19 at 14:28
  • @ARHovsepyan ну чего так сразу. Смысл вопроса понятен, вопрос логичный. Причесать только надо – pavel Oct 09 '19 at 14:28
  • @Razor0109 для справки. char[] и char * это одно и тоже. Если вам надо первый символ - выводите *array (а лучше array[0]). – pavel Oct 09 '19 at 14:29
  • @pavel, да, смысль вопроса ясен, но... Тогда давайте пропускать вопрос типа " что такое массив символов"?.. Я не считаю правильным не открывая учебник пытаться изучать язык в SO – AR Hovsepyan Oct 09 '19 at 14:32
  • В языках С и С++ работа с нуль-терминированными строками (С-строками) всегда ведется именно через "указатель на первый элемент" (см. strlen, strcpy и т.д.). Это, однако, не означает, что все эти функции работают только с "первой буквой". Поэтому не ясно, почему в этом конкретном случае вдруг возник вопрос о "первой букве". – AnT stands with Russia Oct 09 '19 at 14:33
  • Окей, пойду перечитаю эту тему. - @pavel – Razor0109 Oct 09 '19 at 14:39
  • Оператор cout имеет несколько перегрузок: в случае char* он выводит символы, пока не встретит нулевой терминатор. – Alexander Petrov Oct 10 '19 at 15:58
  • @AnT - а если в cout передать int* или любой другой отличный от char указатель - почему он не выводит массив чисел и т. п.? – Alexander Petrov Oct 10 '19 at 16:01
  • @ARHovsepyan - " что такое массив символов" - почему нет? Нормальный вопрос. Может, задавший его много лет кодил на функциональных языках, где списки и другие рекурсивные структуры данных. И концепция массива может быть сложна для восприятия. – Alexander Petrov Oct 10 '19 at 16:03
  • Вы не передаете ничего "в cout". Вы передаете параметры в перегруженный оператор <<. И так реализован стандартный оператор <<. Его ручками именно так написали. Для типа char * (точнее const char *) реализована отдельная версия <<, которая выводит С-строку. С-строка - это не просто "массив символов", а несколько больше. А вот для типа int * не написали отдельного оператора. Можете сами его написать, если хотите. – AnT stands with Russia Oct 10 '19 at 16:08
  • HolyBlackCat, здравствуйте, специально зарегистрировался, чтобы оставить вам ответ на комментарий, но такой возможности у меня, пока, нет, поэтому просто оставляю ответ к этому посту. Сейчас ищу как можно больше информации по данной теме (массивы указателей на строки). Если бы вы могли предоставить мне ссылки или название книг, где я могу почитать подробнее об этой теме, я был бы очень признателен вам. Заранее спасибо. Надеюсь, что вы увидите данный комментарий. – Linka Sep 10 '21 at 13:17
  • добро пожаловать на Stack Overflow на русском! стоило опубликовать это как комментарий, а не ответ. чтобы вам стали доступны комментарии к чужим сообщениям, надо набрать пятьдесят баллов репутации — это всего пять голосов «за» любой ваш ответ или вопрос – aleksandr barakin Sep 10 '21 at 13:18
  • https://ru.stackoverflow.com/q/454263/235436 – Кирилл Малышев Sep 10 '21 at 13:20
  • Пожалуйста, добавьте к своему ответу дополнительную информацию. В текущем виде ваше решение сложно понять. –  Sep 10 '21 at 13:30

1 Answers1

1

Непонятно, почему вы ожидали получить один символ.

Ведь если бы указатель был не на char, а, скажем, на int, то вы получили бы не этот int, а численное значение самого указателя (в шестнадцатеричном виде):

int array[] = {1,2,3};
int *ptr = &array[0];
std::cout << ptr << '\n'; // `0x7ffdc12431dc`, а не `1`

(Вроде бы в стандарте не написано, как точно должны выводиться указатели, но на всех компиляторах, которые я видел, они выводятся как шестнадцатеричные числа.)

Для cout указатели на char - это особый случай. cout считает их указателями на начало строк, и выводит как строки.

HolyBlackCat
  • 27,445
  • 3
  • 27
  • 40