Почему cout печатает массивы символов не так, как другие массивы?

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

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

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

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

4 ответа

Решение

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

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

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

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

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

cout << &arr2 << endl;

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

Другие вопросы по тегам