References are converted to pointers by the compiler so at run time there is no difference in speed. Speed is not the reason you choose references instead of pointers but in fact references might be a bit faster in your overall code simply because you don't need to constantly check for invalid references (NULL pointers).
If a is a small variable (no larger than the machine address size), then there is no difference between a and &a. If a is larger than the machine's address size (e.g. a class object) then &a is faster and &a must be done (rather than a).
Of course you need to consider whether you want to be able to edit a in the called function. If a is large and you want to forbid changing of a, pass a constant reference to a.
If using C++, you should always use references when possible. A good C++ book will list what the difference between references and pointers are. You should consider the following:
References are implemented underneath as pointers. So why use a reference? Because it allows the function writer to determine how a function works without affecting how it is called. With references, the caller of a function doesn't need to know if the function takes a pointer or the object itself. For example, you call the following 2 functions the same way and notice that we can change add1 to use references without affecting all the callers:
int add1 (int a, int b);
int add2 (int &a, int &b) {
// this actually gets converted by the compiler to
// *a + *b
return a + b;
}
If you were using pointers, you'd have to know that the function is actually taking the address, not the object itself. In other words, references add to information hiding.
So to sum up, references are just syntactic sugar. The compiler will convert all references to pointers and operation to references to valid operations with/on pointers.
Second, unlike pointers - a reference is the object. With pointers, you can change the object pointed to or you can change the pointer itself (in which case it will point to something else). With a reference there's only one thing you can change - the referred object.
Third, references cannot be re-assigned to refer to another object like a pointer can. Often, in linked lists you have to move pointers forward/backwards. You can't do this with a reference. Think of a reference as an alias to an object.
Lastly, about the NULL...in C code you will see a lot of NULL pointer checking. References are meant to help with that by allowing the compiler to catch whenever a reference doesn't refer to a valid object. The C++ standard also says that a reference cannot point to an invalid object (e.g. a NULL). However, I think it's up to the compiler on how it implements that so you need to double check with your compiler. I think some compilers will not even warn you.