string это автоматический массив который хранит в себе char (буквы).
Считай как вектор. Размер массива и его выделение он делает сам.
А char* сам по себе это просто указатель. Кто знает куда он указывает и что там находится? В Си договорились что если указатель имеет формат (char*) то функциям ввода - вывода следует интерпретировать его как строку. И не более того.
">>" это перегруженный оператор для классов ввода вывода. По умолчанию он не может напрямую записывать в указатель (это небезопасная операция и не в стиле с++).
Однако вы можете это исправить и добавить соответствующую перегрузку сами.