An important notion in C that I did not learn from my
teachers is:
Operator * does not mean "pointer to" (on the left-hand
side). It is instead the dereference operator - exactly as
it is on the right-hand side (yes, I know it is disturbing
to some).
Thus:
int *pInt
means that when pInt is dereferenced you get an int. Thus
pInt is a pointer to int. Or put differently: *pInt is an
int - dereferenced pInt is an int; pInt must then be a
pointer to int (otherwise we would not get an int when it is
dereferenced).
This means it is not necessary to learn more complicated
declarations by heart:
const char *pChar
*pChar is of type const char. Thus pChar is a pointer
to const char.
char *const pChar
*const pChar is of type char. Thus const pChar is a pointer
to char (pChar itself is constant).
const char *const pChar
*const pChar is of type const char. Thus const pChar is a
pointer to const char (pChar itself is constant).