Не на C ++, я не занимался программированием на C профессионально, но, по крайней мере, на C ++ тип параметров не требует пояснений:
void f( std::string const & ); // input parameter
void f( std::string ); // input parameter again (by value)
void f( std::string& ); // in/out parameter
std::string f(); // output
Что вместе с инструментами документирования в коде (doxygen), где вы добавляете некоторый контекст к параметрам (какие значения ожидаются или неприемлемы для функции, как функция изменяет переданные объекты ...
Об указателях. Мы склонны ограничивать использование необработанных указателей в наших интерфейсах методов. Когда это необходимо, их можно использовать, но в целом предпочтительнее использовать умные указатели. С другой стороны, семантика владения происходит от выбора умного указателя: shared_ptr <> для разветвленной совместной ответственности (или при необходимости), auto_ptr <> / unique_ptr <> для единоличного владения (обычно как возвращаемое значение от фабрик, локальных или атрибутов членов). ..