Почему указатель на char выводит всю строку, а не первый символ?
Потому что вы выводите в cout указатель на char. Если хотите вывести только первый символ, передавайте его по значению:cout << *s;
//или
cout << s[0];
(для простоты опишем так)
Внутри перегруженной версии  operator<<
https://code.woboq.org/gcc/libstdc++-v3/include/st...template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
    {
      if (!__s)
        __out.setstate(ios_base::badbit);
      else
        __ostream_insert(__out, __s,
                         static_cast<streamsize>(_Traits::length(__s)));
      return __out;
    }
под капотом используется sputn
Writes count characters to the output sequence from the character array whose first element is pointed to by s. The characters are written as if by repeated calls to sputc(). Writing stops when either count characters are written or a call to sputc() would have returned Traits::eof().
где count это strlen(s);
P.S.
в C++ string literal это все таки const char*
в С++ есть std::string который является предпочтительным в С++