[
Note 1:
A pointer to
void
does not have a pointer-to-object type, however, because
void is not
an object type
. —
end note]
A pointer to an object of type
T is referred to as a “pointer to
T”
. [
Example 1:
A pointer to an object of type
int is
referred to as “pointer to
int” and a pointer to an object of
class
X is called a “pointer to
X”
. —
end example]
Except for pointers to static members, text referring to “pointers”
does not apply to pointers to members
. Pointers to incomplete types are
allowed although there are restrictions on what can be done with
them (
[basic.types.general])
. Every value of pointer type is one of the following:
A value of a
pointer type
that is a pointer to or past the end of an object
represents the address of
the first byte in memory (
[intro.memory]) occupied by the object
or the first byte in memory
after the end of the storage occupied by the object,
respectively
. [
Note 2:
A pointer past the end of an object (
[expr.add])
is not considered to point to an unrelated object
of the object's type,
even if the unrelated object is located at that address
. A pointer value becomes invalid
when the storage it denotes
reaches the end of its storage duration;
see
[basic.stc]. —
end note]
For purposes of pointer arithmetic (
[expr.add])
and comparison (
[expr.rel],
[expr.eq]),
a pointer past the end of the last element of
an array
x of
n elements
is considered to be equivalent to
a pointer to a hypothetical array element
n of
x and
an object of type
T that is not an array element
is considered to belong to an array with one element of type
T. The value representation of
pointer types is
implementation-defined
. Pointers to
layout-compatible types shall
have the same value representation and alignment
requirements (
[basic.align])
. [
Note 3:
Pointers to
over-aligned types have no special
representation, but their range of valid values is restricted by the extended
alignment requirement
. —
end note]