>I understand how each of these works but I don't know when to use each of them.
Keeping things as simple as possible, pass by reference when you want to change the object and pass by const reference otherwise. Pass by value should be avoided for non-primitive types and pass by pointer has been largely replaced by pass by reference. You can pass pointers by reference as well, so no worries there. This guideline is usually all you need.