What is reference?

A reference is a named memory address, whether a variable or constant. That is, the address-of a named variable is its reference. A pointer variable is a reference that can store a reference. That is, the value of a pointer is a reference. However, while pointers may store a reference to NULL (the value zero, meaning no reference), references can never be NULL. More to the point, a NULL reference will invalidate your program.

Just as you can declare multiple pointer variables to the same reference, you may also declare multiple references to the same name. However, references are not variables in their own right so even though each has its own name they do not require any additional storage beyond the memory they actually refer to, unlike pointers which each require a separate reference of their own in order to store the reference. That is, no matter how many references you declare to the same memory address, there really is only one reference. And because references are not variables, once they've been assigned (always at the point of declaration) they cannot subsequently refer to anything else while they remain in scope. Whereas pointer variables can point to any reference at any time, including NULL.