Most expression operators require complete object types. The only three exceptions are the unary & operator, the first operand of the comma operator, and the second and third operands of the ?: operator. Most operators that accept pointer operands also permit pointers to incomplete types unless pointer arithmetic is required. The list includes the unary * operator.
For example, given the following expression, &*p is a valid subexpression that makes use of this situation.
void *p