I can supply a definitive counter-reference - Section 6.2.5p1 says:
"... Types are partitioned into object types (types that fully describe
objects), function types (types that describe functions), and incomplete
types (types that describe objects but lack information needed to
determine their sizes)."
As an aside, most incomplete types can later be completed, turning
them into object types (a "function type" is never itself incomplete).
(The one special incomplete type that can never be completed is "void".)
If the base types are so partitioned, then the same partitioning must
apply to types derived from the base types, including pointer types.
Yes. However:
Since there's no overlap between object types and incomplete types,
there can be no overlap between pointers to object types and pointers to
incomplete types.
Suppose T is an incomplete type, e.g.:
typedef struct incomplete T;
Then a pointer to T is an object type, not an incomplete type:
typedef T *PT;
There is a simple demonstration of this fact, in that we can create
an array of such pointers:
PT arr[10];
while the Standard says that we can*not* create an array of incomplete
types -- and indeed, an attempt such as:
T arr2[10];
fails.
Hence, given some arbitrary type X, if we are subsequently told that
X is a name for a type that is also spelled "pointer to ...", then
-- regardless of what goes in the "..." part -- we know that X is not
an incomplete type. That means X must be one of an "object type" or
a "function type". Since X is not itself a function type, that
leaves only "object type" as a possibility.
None of this changes the objection to the K&R2 correction wording,
since they say "*pointer to* object type": they really need to say
"pointer to object or incomplete type". But Pete's observation is
correct if interpreted one way, since "pointer to incomplete type"
is itself an "object type". (I am not sure what he meant by the
phrase "object pointers" though.)