If a computer has more than one address space which is used for data, how have C compilers provided access to these?
The context
Some real-life architectures I am thinking about:
KR580VM1 or КР580ВМ1
This is basically an Intel 8080 with the addition of a few registers and a 17th address line. An instruction prefix asserts the 17th address line after the opcode is fetched until the instruction ends; since a pointer is still only 16 bits wide, this naturally divides the address space in two halves. The lower half of the address space may contain code and both halves may contain data.
The peripheral processors of the CDC 6000
These have a 12-bit address bus and can therefore access 4096 machine words of local memory. They also have an 18-bit address bus for addressing a central memory bank.
Cell Processor
These are used in the PlayStation 3 and from what I understand have a similar arrangement to the CDC I mentioned. I'm not sure, but I think the SPEs' address spaces may overlap the PPE's.
The questions
In my head, a pointer is something which kind of looks like an integer since it has discrete values and can count up or down, and it is something which will eventually be put on the address bus. My problem is that for the architectures I described, for various reasons, a pointer does not uniquely identify a memory location. This means that a code generator will need to be concerned in a different way about how to generate the code to dereference a pointer.
So is there an implementation of a C compiler which concerns itself with this problem? Can you describe their solution to me?