int a, b;
error: lvalue required as left operand of assignment
In this context
& is the address-of operator. The value of
&b is a pointer of type
int *. It is a prvalue. This is unrelated to use of the
& symbol in a declaration (where it means the declaration of a reference) -- symbols mean different things in declarators than they do in expressions.
You cannot change the address of a variable. Variables have the same address for their whole lifetime.