The confusion stems from the fact that the word 'reference' is used in
different meanings (or at least in different contexts). C uses
pointers to reference objects: "A pointer type describes an object
whose value provides a reference to an entity of the referenced type.
A pointer type derived from the referenced type T is sometimes called
'pointer to T'." (C99 6.2.5:20). When a pointer is passed to a
function it is passed by value (the pointer value is copied to the
function, sometimes called 'pass by address'). The purpose of this
pointer pass by value is to keep a reference to the original object
(even though it's not pass by reference).
<offtopic>
Accordingly, not even Java uses pass by reference:
http://javadude.com/articles/passbyvalue.htm . OTOH, Java uses
references extensively and most people would agree that it employs
'reference semantics'.
C++ references allow pass by reference. Alas, a reference in C++ is
merely an "alias (an alternate name) for an object"
(
http://www.parashift.com/c++-faq-lite/references.html#faq-8.1). So
C++ references don't reference anything, at least not in meaning used
for C pointers and Java references.
</offtopic>