References are frequently used for pass-by-reference:
void swap(int& i, int& j) { int tmp = i; i = j; j = tmp; } main() { int x, y; //... swap(x,y); }Here, i and j are aliases for main's x and y respectively. In other words, i is x -- not a pointer to x, not a copy of x, but x itself. Anything you do to i gets done to x, and vice versa.
Underneath it all, references are typically implemented by pointers. The effect is as if you used the C style pass-by-pointer, but the "&" is moved from the caller into the callee, and you eliminate all the "*"s.