Suppose I have a micro controller with a main loop and 1 millisecond interrupt (if you don't know what that is it is just a task that interrupts the main loop's execution, while it does something.....and it is a 1 millisecond interrupt, because it happens every millisecond).
I have a variable that I use to communicate between the main loop and the millisecond interrupt:
volatile status_t Status;
cli(); // This temporarily turns off interrupts, so we don't
// modify the variable unsafely
sei(); // Turn interrupts back on
status_t* localStatus = (status_t*)&Status;
Status = *localStatus;
Your second version might still write to the microcontroller multiple times, because the compiler may not realize it can cache the value across method calls (it could probably only determine this if the methods are inline). So I suggest making an explicit local copy, not just a local pointer.
cli(); status_t localStatus = Status; localStatus.UpdateStuff(); localStatus.UpdateOtherStuff(); ... Status = localStatus; sei();