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

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

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

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

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

Ответы

Ответ 1

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

cout << static_cast<const void*>(arr2) << endl;

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

cout << &arr2 << endl;