Actually and unfortunately your code is not doing what you think:
I. 0x0x40090120 will not compile at all.
1. This structure is 4 bytes long (not 16)
2. (unsigned int *)(&x_temp) = (unsigned int *)0x0x40090120 ; -will bot compile at all
2.1 (unsigned int *)0x20000120 = (unsigned int *)(&x_temp); will not compile at all.
those two will compile but both of them do not do what you expect as the structure is 4 bytes long.
*((unsigned int *)0x20000120) = (unsigned int)&x_temp;
*((unsigned int *)0x20000120) = *((unsigned int *)&x_temp);
3. 32 bit access requires alignment. You cam always do two 16 bit operations instead.
3. Line 12 reads and writes 32 bit value (not 16)4