*x does not dereference a pointer; it converts it into an lvalue. That's why *x
= expr is allowed.
The standard does not use any form of the word "dereference" in any
other part of the standard, except that footnote, so it's arguable what
is meant by that word. However, that footnote is referred to by
6.5.3.2p4: "... If an invalid value has been assigned to the pointer,
the behavior of the unary * operator is undefined.87)"
It is the unary * operator itself which has undefined behavior, not the
assignment operator when it is assigned to. If "the invalid values for
dereferencing a pointer" does not directly refer to "an invalid value"
for which "the behavior of the unary * operator is undefined", then what
is that footnote doing in that position?
In any event, footnotes are not normative; it's not the footnote that
makes the behavior undefined, it merely points out something that can be
derived from the normative text.
6.5.3.2p4 defines the behavior of the unary * operator "If the operand
points to a function...", and "... if it it point to an object ...", but
it provides no definition of the behavior in any other case. A null
pointer doesn't point at anything, neither a function, nor an object, so
the behavior of the unary * operator on such a pointer is undefined "by
the omission of any explicit definition of behavior." (4p2). There are
exceptions when it is not evaluated at all. That occurs when it is the
operand of a & or sizeof operators (6.5.3.2p4 and 6.5.3.4p2, respectively).