volatile is to tell the compiler not to optimize the reference, so that every read/write does not use the value stored in register but does a real memory access
On the usefulness of volatile:
This is needed, if you need to check memory, which is modified by hardware like a serial interface controller. It has its application in the world of embedded systems, where you work very close to the hardware without any OS in-between.