I wouldn't consider this a good practice. Pointers are a main-stay of C/C++ development and b/c of that, C/C++ coders are comfortable with the de-reference syntax needed by pointers. I do try and avoid the use of pointers when possible (not for syntactical reasons though), but sometimes it's just the best tool for the job. If you have code that is gnarly b/c you're using a pointer, I would typically de-reference it into a function that passes the object by reference which essentially does what you're doing, but in my opinion it does so in a more elegant way. So instead of:
shared_ptr<std::vector<int> > sp = get_sp_to_vector();
std::vector<int>& vec = *sp;
...ugly stuff...
vec.push_back(5);
I would do:
void func(std::vector<int> &vec)
{
... previously ugly stuff...
vec.push_back(5);
}
shared_ptr<std::vector<int> > sp = get_sp_to_vector();
func(*sp);
EDIT:
This isn't to say that you should create a function simply to create nicer syntax for pointers, as it is to state that if you don't like pointer syntax and your code uses clean and concise functions, you can simply make the functions take references and de-reference your pointer when calling the function. For situations where you have only a few calls to *p or p->x, it seems silly to create a function with a reference or to create a reference in order to call p.x. Just use the pointer syntax in these cases as this is C/C++ syntax.
Others have brought up using references within loops where a pointer may have to be de-referenced many times. I do agree that in these cases a reference would be beneficial.