Почему 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; 
  • Является ли законным сравнивать висячие указатели?
  • постоянный указатель vs указатель на постоянное значение
  • Что гарантируется относительно размера указателя функции?
  • Должен ли кто-нибудь установить указатели на «NULL» после освобождения?
  • Почему cudaMalloc () использует указатель на указатель?
  • Изменение строковых констант?
  • Передача двумерного массива структур
  • Как увеличить адрес указателя и значение указателя?
  • Вызывать функцию golang struct дает «не может ссылаться на невыполненное поле или метод»
  • C / C ++: арифметика указателей
  • Как распечатать адрес памяти в C
  • Interesting Posts

    URLConnection getContentLength () возвращает отрицательное значение

    Windows 7: невозможно просмотреть общие сетевые ресурсы в проводнике, но «сетевой сетевой диск» отлично работает

    В bash, как сортировать строки с числами в них?

    Можно ли запускать несколько виртуальных машин с независимой клавиатурой мыши + на одном ПК?

    Подождите, пока флаг = true

    Вызов собственного метода дважды из сторонней библиотеки в Activity приводит к закрытию приложения Android

    Как защитить почтовые адреса от ботов на веб-странице?

    Открытие PowerShell в текущем рабочем каталоге из реестра

    Недоступно для внешнего доступа из локальной сети

    Искать выбор в vim

    Вызов метода активности из адаптера

    Как я могу реализовать список проверки динамических зависимых данных в Excel

    Экран дисплея нетбука искажен (имеет черно-белые и горизонтальные линии, зависание экрана и / или неправильную позицию отображения)

    Как заставить Windows 7 использовать определенные сетевые адаптеры для каждой программы?

    Декартово произведение двух списков

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