The pointers itself don't seem to be the problem. Rather, it's C's strange syntax which tries to mimick a variable's use in its declaration. I.e. "int * * p;" doesn't mean "p is a pointer to a pointer to an int", but it means "* * p is an int". And so goes away any contradiction.
Yes it means both. It is just a hint how to read / write it: Don't make up some type syntax, but use the variable usage syntax and what's left is primitive types.