It's not just personal taste. Reference & Pointers tell you about the code.
- const Foo &myFoo means this is an input variable, which cannot be null. Probably it's a large struct and we're using reference to avoid passing by value. If the reference is actually null, something really bad happened before entering the function. GDB & MSVC both support showing the address (just print &myFoo)
- const Foo *myFoo means this is an input variable, but the pointer may be null. i.e. optional. Check the documentation to see if you can assume it cannot.
- Foo &myFoo. This is an output variable. You're expected to modify it. Could also be input, but this is discouraged for many reasons.
- Foo *myFoo. This could be an output variable. Or could be that you need to write to raw memory (i.e. gpu pointer) and/or do some pointer addressing math. Could be null (you may not be always expected to modify it). Could also be input. The most ambiguous of all.
Additionally, pointers can have a few more qualifiers that sadly references do not, such as __restrict, which is very powerful in code optimization.