Массив типа char и указатель. C++

120
20 августа 2019, 09:10

const int arrayLength = 9; char name[arrayLength] = "Jonathan"; int numVowels(0); for (char *ptr = name; ptr < name + arrayLength; ++ptr) { switch (*ptr) { case 'A': case 'a': case 'E': case 'e': case 'I': case 'i': case 'O': case 'o': case 'U': case 'u': ++numVowels; } }

std::cout << name << " has " << numVowels << " vowels.\n";

Есть такой фрагмент кода. Когда я создаю указатель на массив, то указатель получает адрес первого элемента массива. Но почему-то когда я пишу std::cout << ptr то я получаю Jonathan. А если пишу std::cout << *ptr , то получаю J. Как получается так, что я разыменовал Jonathan как J. Я понимаю, что если бы я создал int array[] и написал std::cout << array то получил бы какой - то адрес, а как получается, что при создании такого же массива толЬко типа char я получаю вместо адреса строчку, а если я напишу std::cout << &name то как раз таки получу адрес ( адрес первого элемента же? ).

Answer 1

В этом коде не создается ни одного указателя на массив. ptr - Это указатель на первый элемент, да. Если написать std::cout << ptr, то вызовется перегрузка для типа char const * которая будет печатать не адрес указателя, а оканчивающуюся нулем С-строку. Чтобы напечатать адрес достаточно сделать приведение:

::std::cout << static_cast<void const *>(ptr);
Answer 2

Разыменование вашего ptr - это именно J, а не никакой не Jonathan

А что будет получаться при

std::cout << ptr;

зависит от того, что написано в перегрузке оператора << для типа вашего ptr. Там можно написать что угодно, в том числе всегда выводить слово "Вася". Как вы сами понимаете, никакого отношения поведение этого оператора к собственным свойствам ptr не имеет и удивлять вас это поведение не должно.

Ваш ptr имеет тип char *. Специально для const char * в стандартной библиотеке написана перегрузка оператора <<, которая выводит содержимое всей С-строки, указываемой этим указателем. Его вы и наблюдаете.

Остальные указательные типы в вашем примере попадают в перегрузку оператора << для типа const void *, которая просто выводит адрес.

READ ALSO
Работа заголовочных файлов

Работа заголовочных файлов

Возможно вопрос покажется глупым, но я новичок в работе с С++

103
Минимальный размер QWidget с учетом содержимого

Минимальный размер QWidget с учетом содержимого

Мне необходимо чтобы виджет занимал минимально возможное пространство, но с учетом того, что он не может быть меньше, чем его содержимоеЕго...

96
Как устроен массива типа char?

Как устроен массива типа char?

Когда я создаю char name[] = "John" и пытаюсь разыменовать *name то получаю JЭто значит name сам по себе это адрес? Если да, то адрес чего? Насколько я знаю,...

137