volatile warns the optimizer that a variable can change without notice, so we need to know why that would ever matter. And for that, we’ll take a quick glimpse into the logic of (one type of) compiler ...
a_struct.pmem_i; // the type is, wait for it, int* volatile (the pointer is volatile not the object it is pointing to) The second line is a very important point to keep in mind when declaring structs.
If you need to control access to certain pieces of data in a class when writing multithreaded applications, see how you can use the volatile keyword to get a similar effect as using the synchronized ...