cin >> ptr;
является синтаксическим сахаром для вызова этой функции:
operator >>(std::cin, ptr);
Это должно прояснить, что с именем operator >>
будет связан набор перегрузки. И действительно, глядя на ссылку , мы видим, например, вот этот:
template< class CharT, class Traits>
basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>& st, CharT* s );
это функция, которую вы вызываете. Он принимает экземпляр std::basic_istream
(который std::cin
) и указатель на базовый тип символа (ptr
в вашем случае) и делает правильные вещи.
Когда вы вместо этого вызываете
operator >>(std::cin, *ptr);
вы разыменовываете указатель на массив char
, который возвращает ссылку на первый элемент этого массива. Существует перегрузка, которая принимает ссылку на один char
(# 1 в списке перегрузок), но ничего не делает, кроме чтения одного char
и все. Ввод, отличный от первого char
, будет отброшен.