normally I'll write it in this form:
const X * const
the first const, sice it's closer to X, it means the X pointed to by the pointer cannot be changed.
The second const, since it's closer to the *, it means the pointer variable itself cannot be changed to point to some other address.
Sometimes you need one of them, sometimes you need both, it depends on your requirement.
For example, when writing a function return type, the second const is useless.