References are pointers in disguise, or at least that's a safe way to think of them.
One reason for them is because C and C++ don't have "var" parameters, as in Pascal etc. Using a reference gives you something very close to that, but unlike "var", it can also be used elsewhere - e.g. to give you a quick shorthand for something else...
int& alias = thing.blah [foo]->bar;
handle (alias, alias+1, alias*2);
References are also returned by a lot of functions, meaning the "result" of the function can be written to as well as read, as in...
std::deque<int> mydeque;
mydeque.push_back (1);
mydeque.back () += 1; // increment the top item on the stack
The same functionality could be achieved using a pointer, but a reference is more convenient. The usual term is "syntactic sugar".
A useful (but not completely reliable) fact about references is that you're less likely to accidentally change the underlying pointer, since it takes a bit of work to access that pointer rather than the pointed-to value. This is a helpful hint to choosing - use the one that creates the least clutter in your code.