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