Данная статья практически на 100% отражает и мой подход к использованию ссылок и указателей, рекомендую к ознакомлению:
http://eao197.blogspot.ru/2015/11/progthoughts-c.html
Тезисно:
void f(const T &p)ожидает реально существующий объект, но не изменяет его;void f(T &p)ожидает реально существующий объект и изменяет его;void f(const T *p)ожидает объект илиnullptr, если объект существует, то не изменяет его;void f(T *p)ожидает объект илиnullptr, если объект существует, то изменяет его;void f(unique_ptr<T> p)ожидает объект илиnullptr; если объект существует, то забирает ответственность за его удаление;void f(shared_ptr<T> p)ожидает объект илиnullptr; если объект существует, то разделяет владение этим объектом (что дает право функцииf()сохранитьpу себя для дальнейшего использования или передать кому-то еще).