read it backwards. Like to answer in the stackoverflow link.
1 - int * const p is read as: p is a constant pointer to integer.
2 - intconst* p is read as: p is a pointer to constant integer.
3 - constint *p is read as: p is a pointer to integer constant.
replace: const with "constant", * with "pointer to", and int with "integer"
1, 2, 3: p is a pointer.
1: p cannot change its value (the address it points to) since it is a constant pointer (or pointer constant).
2, 3: p can change its value (it can point to another addresses).
So 1 is not equivalent to 2... but 2 and 3 are the same.