One reason to use pointers is if it makes sense to pass a NULL
value into the function. With a pointer, it's expected to be able to do this. With a reference, it is not expected to be able to do this.
(However, by doing tricky things it is still possible to pass a NULL into a reference parameter. You can expect that the called function may crash in this case.)
Another convention is that if you pass a pointer into a function, the function may use the pointer to take ownership of the object (especially in a COM-like reference counted environment). If you pass a reference, then the called function can expect to use the object for the duration of the function call but not to keep a pointer to the object for use later.