Почему 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.