Почему cout печатает массивы char по-разному от других массивов?

Я использую C ++, чтобы понять, как именно работают указатели. У меня есть эта часть кода с использованием массивов, которые я использую, чтобы понять, как эквивалент работает с указателями.

int main() { int arr[10] = {1,2,3}; char arr2[10] = {'c','i','a','o','\0'}; cout << arr << endl; cout << arr2 << endl; } 

Однако, когда я запускаю это, arr выдает адрес первого элемента массива ints (как и ожидалось), но arr2 не выводит адрес первого элемента массива символов; он на самом деле печатает «циао».

Что мне не хватает или что я еще не узнал об этом?

Это оператор <<, который перегружен для const void* и для const char* . Ваш массив символов преобразуется в const char* и передается этой перегрузке, потому что он лучше подходит для const void* . Однако массив int преобразуется в const void* и передается в эту версию. Версия оператора << принятия const void* просто выводит адрес. Версия, принимающая const char* фактически обрабатывает ее как C-строку и выводит каждый символ до конечного нулевого символа. Если вы этого не хотите, конвертируйте свой массив символов в const void* явно, передавая его оператору <<:

 cout << static_cast(arr2) << endl; 

Потому что operator << arr2 operator << перегружен для char* для вывода строк, а arr2 соответствует этому.

Если вам нужен адрес, попробуйте отличить массив символов как указатель на пустоту.

Существует стандартная перегрузка для char *, которая выводит строку с завершенным нулем.

Хотя кастинг, вероятно, более значимый подход, вы также можете использовать оператор addressof:

 cout << &arr2 << endl; 
  • Объявление типа указателей?
  • Строки C ++: vs. *
  • Какова цель выделения определенного объема памяти для массивов в C ++?
  • Дублирование объектов в Java
  • Причина передачи указателя по ссылке в C ++?
  • Как сравнить указатели?
  • Указатель функций, отлитый от другой подписи
  • Разделение этого указателя дает мне -46, но я не уверен, почему
  • В чем разница между NULL, '\ 0' и 0
  • Как происходит разыменование функционального указателя?
  • Что происходит в ОС, когда мы разыскиваем указатель NULL в C?
  • Interesting Posts

    Итераторы отладки Visual Studio

    Создавать распределение размеров файлов из командной строки

    Классы Spring MVC должны быть streamобезопасными

    Как использовать параметр «–bare» в Rails 3.1 для CoffeeScript?

    Ошибка при попытке запустить проект: ожидается, что модуль будет содержать манифест сборки

    Восстановление Windows 7 MBR с загрузочного компакт-диска Hiren

    Я хочу изменить DPI с помощью ImageMagick без изменения фактического размера байтов данных изображения

    Android Studio отмечает R красным цветом с сообщением об ошибке «не удается разрешить символ R», но assembly завершается успешно

    Xcode – профиль iPhone не соответствует какой-либо действительной паре с сертификатом / закрытым ключом в ключевом ключе по умолчанию

    Какая часть бросания Исключения стоит дорого?

    Захватить снимок экрана активного windows?

    Передача целых чисел в виде постоянных ссылок и копирование

    Почему все пользовательские агенты браузеров начинаются с «Mozilla /»?

    Передача данных из Activity to Service с использованием намерения

    Приложение Excel VBA автоматически останавливается с сообщением «Выполнение кода приостановлено»

    Давайте будем гением компьютера.