int x = 10;
lvalue is an expression that potentially designates an object.
Because &x isn't a label, it's a pointer to a labeled value.
To help you understand why this is important, I'm going to give an explanation of the different types of references:
labels - also called 'aliases' or 'names', they identify some value or object. in a dynamically-typed language, the value or object they identify can change; whereas in a statically-typed language, it stays the same. an example of a label-type reference in C would be
pointer - a pointer identifies the address of some value or object. this is useful for implementing aliasing (having multiple references to the same object). an example of a pointer-type reference in C would be
int *x; or
handle - a handle is a unique identifier (usually an integer) for some value or object. like pointers, they allow for aliasing; but a handle cannot be dereferenced like a pointer. This is extremely useful because it can be used to hide the underlying implementation of a data structure and allow for a memory manager to safely rearrange memory (eg. defragmentation) to improve cache coherency and boost performance. an example of a handle-type reference in C would be the
int value returned by POSIX
Off-topic: In Golang, when you try to assign to the member of a pointer-type object, it's automatically dereferenced; so there's no need for a
-> operator. For
v.x would be interpreted as