#c #pointers
#c #указатели
Вопрос:
У меня есть этот (рабочий) код:
char * ptr = new char[10];
cin >> ptr;
вывод: cout<<*(ptr n)
является результатом ввода.
почему это cin>>ptr
работает, разве так не должно быть cin>>*ptr
?
Комментарии:
1.
*ptr
это один символ, а не адрес, что означает, чтоcin
нет способа узнать, куда поместить последующие символы.2. Существует перегрузка для
char*
, которая выбирается в этом случае: en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt23. cin является интеллектуальным при считывании данных в переменную и автоматически определяет форматирование, которое должно быть применено (целое число, с плавающей точкой, символ или строка) в вашем случае ptr — это строка (массив символов), что означает, что стандартный ввод будет интерпретироваться как строка при вызове cin >> ptr. *ptr — это первый символ массива, что означает, что cin >> *ptr будет считывать символ в *ptr
Ответ №1:
cin >> ptr;
является ли синтаксический сахар для этого вызова функции:
operator >>(std::cin, ptr);
Это должно сделать более понятным, что с именем будет связан набор перегрузок operator >>
. И действительно, глядя на ссылку, мы видим, например, эту:
template< class CharT, class Traits>
basic_istream<CharT,Traits>amp; operator>>( basic_istream<CharT,Traits>amp; st, CharT* s );
какую функцию вы вызываете. Для этого требуется std::basic_istream
создание экземпляра (который std::cin
есть) и указатель на базовый символьный тип ( ptr
в вашем случае) и все делается правильно.
Когда вы вместо этого вызываете
operator >>(std::cin, *ptr);
вы разыменовываете указатель на char
массив, который возвращает ссылку на первый элемент этого массива. Существует перегрузка, которая принимает ссылку на один char
(# 1 в списке перегрузок), но она ничего не сделает, кроме чтения одного char
и все. Ввод, отличный от первого char
, будет отброшен.