Your operating system (OS) uses virtual memory. In short: Each process occupies a 64bit address range. Usually (depending on the OS) the lower addresses will be used by the program text and/or constant data and the heap and grows to higher values. Each process' stack usually starts at top of the address range growing to lower address values.
Depending on your hardware and your OS a process wouldn't in fact never be allocated 2^64 Bytes. But it could be much more than your computers size of RAM due to swapping out some less used pages of memory onto your hard disc.
Interesting... I declared local ii2 as static and now its address 0x740090, which is 7602320 decimal. Now that looks like a legitimate address. I do not get though why the address of a local variable is so large.
The OS has to manage memory for multiple different processes... so yes.
If you're imagining RAM as if it were a giant array where each address refers to an element in that array, that's overly simplistic and is not how it actually works. Addresses often do not correspond directly to a the region in memory like you might expect. There is all sorts of paging, caching, and mapping going on behind the scenes.
The days of [PC] software directly accessing memory are over, and have been for quite some time.
But really... none of this should matter. You, as a programmer, do not need to care about how this is done. Unless you're actually writing/modifying the code within the OS that does this stuff, it really could not be any less significant.