Object pointer dereferencing does not itself produce the value to which the pointer points. Instead it produces an lvalue that refers to that value. In the words of the standard:
The unary *
operator denotes indirection. If the operand points to a
function, the result is a function designator; if it points to an
object, the result is an lvalue designating the object. If the operand
has type "pointer to type", the result has type "type".
(C2011, 6.5.3.2/4; emphasis added)
Unary *
is thus among a class of operators that can be considered to operate on the identity of an object, as opposed to on its value. The &
operator and and some uses of the sizeof
operator can also be considered to be in this category.