Every process is given its very own virtual address space. For 32-bit processes, this address space is 4 GB - that is, a 32-bit pointer can have any value from 0x0000000 through 0xFFFFFFFF, allowing a pointer to have 4,294,967,296 values. For 64-bit processes, this address space is 16EB (exabytes). A 64-bit pointer can have any value from 0x0000000'00000000 through 0xFFFFFFFF'FFFFFFFF, allowing a pointer to have one of 18,446,744,073,709,551,616 values.
To help the reader understand, I will explain a little bit more about every process having its own private address space. One process can have a data structure stored in its address space at address 0x12345678, while a second process can have a totally different data structure stored in its address space at address 0x12345678. Threads running in the first process cannot access the data structure in the second process's address space, and vice versa.
Keep in mind that this is virtual address space - not physical storage. This address space is simply a range of memory addresses. Physical storage needs to be assigned or mapped to portions of the address space before you can successfully access data without raising access violations.

