Вывод строк
При выводе массива символов (строки) с помощью `cout << string;` происходит следующее:
1. Оператор `<<` для `cout` имеет специальную перегрузку для работы с типом `const char*`.
2. Когда вы передаете массив символов в `cout`, он неявно преобразуется в указатель на первый элемент массива.
3. Эта перегрузка оператора знает, что нужно выводить символы последовательно, пока не встретится нулевой символ (`'\0'`), который означает конец строки.
Поэтому в примере:
char string[] = {'H', 'I', '\0'};
cout << string;
Выводится "HI", так как `cout` продолжает выводить символы до тех пор, пока не встретит нулевой символ.
Вывод числовых массивов
С числовыми массивами ситуация иная:
1. Для числовых типов нет специальной перегрузки оператора `<<`, которая бы интерпретировала массив как последовательность чисел.
2. При попытке вывести числовой массив, например `int arr[] = {1, 2, 3};`, выражение `arr` преобразуется в указатель на первый элемент массива.
3. `cout` выводит этот указатель как адрес в памяти, а не содержимое массива.
Почему так сделано
1. **Историческая причина**: В C строки представлялись как массивы символов, заканчивающиеся нулевым символом. Эта концепция была унаследована C++.
2. **Эффективность**: Для строк это удобно, так как часто нужно выводить весь текст. Для числовых массивов такой подход менее универсален, так как может потребоваться выводить только часть массива или в особом формате.
3. **Гибкость**: Для числовых массивов предпочтительнее использовать циклы, что дает больше контроля над форматом вывода и позволяет обрабатывать массивы произвольной длины.
Чтобы вывести числовой массив, вам нужно использовать цикл:
int arr[] = {1, 2, 3};
for (int i = 0; i < 3; ++i) {
cout << arr << " ";
}
Это дает больше гибкости при работе с числовыми данными.