Address operator &

The & (address) operator yields a pointer to its operand. The operand must be an lvalue, a function designator, or a qualified name. It cannot be a bit field.

C only It cannot have the storage class register.

If the operand is an lvalue or function, the resulting type is a pointer to the expression type. For example, if the expression has type int, the result is a pointer to an object having type int.

If the operand is a qualified name and the member is not static, the result is a pointer to a member of class and has the same type as the member. The result is not an lvalue.

If p_to_y is defined as a pointer to an int and y as an int, the following expression assigns the address of the variable y to the pointer p_to_y :
p_to_y = &y;

IBM extension The address operator has been extended to handle vector types, provided that vector support is enabled. The result of the address operator applied to a vector type can be stored in a pointer to a compatible vector type. The address of a vector type can be used to initialize a pointer to vector type if both sides of the initialization have compatible types. A pointer to void can also be initialized with the address of a vector type.

Begin C++ only The ampersand symbol & is used in C++ to form declarators for lvalue references in addition to being the address operator. The meanings are related but not identical.
int target;
int &rTarg = target;  // rTarg is an lvalue reference to an integer.
                      // The reference is initialized to refer to target.
void f(int*& p);      // p is an lvalue reference to a pointer
If you take the address of a reference, it returns the address of its target. Using the previous declarations, &rTarg is the same memory address as &target.

You may take the address of a register variable.

You can use the & operator with overloaded functions only in an initialization or assignment where the left side uniquely determines which version of the overloaded function is used. End C++ only

IBM extension The address of a label can be taken using the GNU C address operator &&. The address can thus be used as a value.