What are volatile variables in C, and why are they critical when writing code for embedded systems or hardware registers used in Sandisk products?