I don't see how the bool example follows; in what way is negating a boolean like dereferencing a pointer w/r/t types? ! is bool->bool; * is * P -> P.
The reason the same symbol is used is because of the way C types are read:
int x; // (x) is an int
int *x; // (*x) is an int
int **x; // (**x) is an int
int x(double); // (x(1.)) is an int