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
то как раз таки получу адрес ( адрес первого элемента же? ).
В этом коде не создается ни одного указателя на массив. ptr
- Это указатель на первый элемент, да. Если написать std::cout << ptr
, то вызовется перегрузка для типа char const *
которая будет печатать не адрес указателя, а оканчивающуюся нулем С-строку. Чтобы напечатать адрес достаточно сделать приведение:
::std::cout << static_cast<void const *>(ptr);
Разыменование вашего ptr
- это именно J
, а не никакой не Jonathan
А что будет получаться при
std::cout << ptr;
зависит от того, что написано в перегрузке оператора <<
для типа вашего ptr
. Там можно написать что угодно, в том числе всегда выводить слово "Вася"
. Как вы сами понимаете, никакого отношения поведение этого оператора к собственным свойствам ptr
не имеет и удивлять вас это поведение не должно.
Ваш ptr
имеет тип char *
. Специально для const char *
в стандартной библиотеке написана перегрузка оператора <<
, которая выводит содержимое всей С-строки, указываемой этим указателем. Его вы и наблюдаете.
Остальные указательные типы в вашем примере попадают в перегрузку оператора <<
для типа const void *
, которая просто выводит адрес.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне необходимо чтобы виджет занимал минимально возможное пространство, но с учетом того, что он не может быть меньше, чем его содержимоеЕго...
Когда я создаю char name[] = "John" и пытаюсь разыменовать *name то получаю JЭто значит name сам по себе это адрес? Если да, то адрес чего? Насколько я знаю,...