Addresses that you are seeing through your debugging tool are logical memory addresses. Every time a program is spawned, the CPU allocates certain bytes of memory to the program. On the hardware, this may be allocated in one single chunk or it may be strewn over in parts all over the place. However, to make it simpler for the program to refer to memory locations, the CPU maps these hardware or physical memory address to logical address.
A program interacting within this address space does not see other programs. Only the CPU knows which physical address to fetch when the program refers to some logical memory address within the code.
So, two different programs can refer to the same logical memory location, say 0x7c900000. But the CPU knows where to point this instruction to on the physical RAM. This makes life simpler for the programmer when memory management is taken care of by the CPU.
About ASLR (Adress Space Layout Randomization):
ASLR was introduced because it was fairly easy to reach the exact point in memory during program execution to find buffer overflow vulnerable variables. This made writing exploits easy. ASLR randomized the placement of variables making it difficult for hackers to exploit buffer overflow vulnerabilities.
So without ASLR, the variables in your program and instructions are going to be loaded in the exact same (logical) locations every time you execute it.