Почему cout печатает массивы символов иначе, чем другие массивы? - PullRequest
14 голосов
/ 02 февраля 2009

Я использую 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 ]

28 голосов
/ 02 февраля 2009

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

cout << static_cast<const void*>(arr2) << endl;
4 голосов
/ 02 февраля 2009

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

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

0 голосов
/ 02 февраля 2009

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

cout << &arr2 << endl;
0 голосов
/ 02 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...