улучшение понимания синтаксиса указателя в массиве символов

#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_gtgt2

3. 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 , будет отброшен.