An assignment operator has two operands. The left operand must be a "modifiable lvalue".
An "lvalue" is, roughly, an expression that designates an object.
(An "rvalue", as the C standard uses the term, is simply the value that results from evaluating an expression. The C standard defines the term, but rarely uses it. The usage is a bit inconsistent: an "lvalue" is an expression, but an "rvalue" is a value.)
The right operand is evaluated to yield a value. That value is then converted, if necessary, to the type of the left operand, and the result is stored in the object designated by the left operand.
Addresses are not required. For example, a variable defined with register
has no address, but it can still be the target of an assignment.
If you want the gory details, see section 6.5.16 of the C standard (the link is to n1570.pdf
, the most recent draft, a 1.7-megabyte PDF).