An opaque object exposes no directly usable representation or contents; programs handle it only through operations permitted by its abstraction. In C, pointers illustrate this boundary: their binary representation is platform-dependent and treated as irrelevant, while initialization, assignment, evaluation, and later pointer operations remain available. section 6.2
Pointer states
The declarations `char const*const p2string = "some text";`, `char const*const p2nothing = 0;`, and `char const*const p2empty = "";` represent three different cases: a valid pointer, a null pointer, and a pointer to an empty string. A pointer initialized or assigned with `0` is null and evaluates false in a logical expression. An uninitialized pointer, such as `char const*const p2invalid;`, is indeterminate; using it leads to undefined behavior. section 6.2
Opaque structures apply the same separation to library interfaces. A header can forward-declare `struct toto` and expose functions accepting or returning `struct toto*` without revealing the structure definition. Client code can use the interface, while the implementation retains control of the representation. section 11.2
Keep these distinctions visible:
- A null pointer is not a pointer to an empty string. section 6.2
- Hiding a pointer inside a typedef can conceal that `0` is a meaningful argument. section 11.2

