Регистрация
18 Май 2013
Сообщения
99
Репутация
0
Спасибо
1
Монет
0
Я особо не обращал на это внимание но сейчас мне стало интересно, почему массив символов (char a[]) можно вывести на консоль просто указав имя массива и выведется весь массив? почему так не работает например с массивом чисел?(надо перебирать в цикле) просто это как то не логично, по факту имя массива является первым его элементом и в случае с например массивом чисел при разыменовании имени массива ты получишь его первый элемент, но в случае с массивом символов это правильно вообще не работает, даже без разыменования выводится весь массив,из за чего я сейчас в заблуждении
 
Все очень просто, все функции, работающие со строками в ASCII кодировке (а именно такая кодировка у строк, составленных из переменных типа char, т.к. у них размер 1 байт), считают ее концом нуль-терминатор строки (NUL) или нулевой ASCII символ, который, понятно по названию, имеет код 0.

Все функции ввода ASCII строк дописывают после ввода самой строки в ее конец этот самый символ NUL (то есть просто в конец строки записывают нулевой байт) и уже другие функции, которые будут работать с ней, ожидают получить на вход указатель на первый символ строки, который ты и передаешь, указывая название массива (так как по сути своей массив и указатель это одно и тоже, имя массива есть указатель на его первый элемент и с ним можно работать как с обычным указателем и наоборот, с указателем можно работать как с массивом, индексируя его) и будут считывать ее до тех пор пока не наткнуться на нуль-терминатор, после чего считывание прекратится, с массивами чисел так не работает потому что само число в нём вполне может быть нулём, когда символ - нет, т.к. нулевой символ - служебный.
 
Думали в каком виде в Си хранить в памяти текст. Пришли к выводу что проще всего хранить его в виде непрерывной последовательности байт, оканчивающейся нулем (т.е. массив чаров). А раз текст хранится в виде массивов чар, то и все функции для работы со строками работают с указателем на чары (char* или const char*). Cи++ является надстройкой над Си, поэтому char* так же интерпретируется операторами вывода как попытка вывести строку символов, а не адрес в указателе. (покрайней мере если в 90% случаев char[] является текстом, то давайте по умолчанию распознавать его именно как текст. В остальных 10% случаев программисту будет не в тягость добавить (void*) чтобы получить адрес. Или (int)char чтобы получить значение а не символ.)
 
Скорее всего так перегружен оператор вывода, по причине: массив символов это строка, которая рассматривается как единое целое (мы же не делим слова на части, не пиш ем в о т та к), а массив чисел состоит из элементов, не являющихся единым целым, это просто набор чисел
 
Нельзя так выводить символьный массив, если в нем не строка. При указании в cout имени символьного массива он выводится в предположении, что в нем находится строка, а это совсем не всегда так. Выводится, кстати, не массив, а содержащаяся в нем строка, если длина массива 100, а в строке 5 значимых символов, выведутся только 5 символов строки.
C++, как и чистый C, был придуман по принципу "два пишем, три в уме", многое в нем неинтуитивно.
192534725_79da867a2bdf0980ba11694689e113b8_800.jpg

 

Похожие темы

Назад
Сверху