What are volatile variables in C, and in what specific scenarios must you use them when interfacing with hardware?