The answer is sorting none.
In general terms, the address of a variable in memory is in the context of the address space of a program.
What distinguishes the way the address space of the program is mapped to the equipment of the host system.
With modern hardware that has a memory management unit (MMU) and operating systems (or device drivers) that use the MMU, the address space of the program is mapped to physical memory, which can consist of RAM or virtual memory, such as a swap file on the hard drive. The operating system uses an MMU to isolate programs from each other (so the two processes cannot access a different address space), and also uses an MMU to support the exchange of data between RAM and swap. An ongoing process cannot even determine where its data resides in physical memory, because the operating system and MMU specifically prevent it. Over time, the operating system and the MMU can transfer the memory used by the program to different areas of RAM or for exchange, but the program cannot detect this, since the operating system and the MMU take care of displaying the address in the program (which never changes as far as the program is concerned ) to the actual address. This covers the latest versions of windows, unix and various real-time operating systems. (These systems also typically provide software access to physical memory, but only for programs running with higher privileges or kernel-mode drivers).
Older hardware did not have an MMU, so operating systems could not provide programs with separate address spaces. In such systems, the address visible by the program had a one-to-one correspondence with the location in the physical memory.
Somewhere between them was equipment that had separate areas of physical memory (for example, provided by individual banks of memory chips). In these systems with support for special drivers, the host system can implement a partial mapping between addresses in the program address space and places in certain areas of physical memory. This is why some target systems and compilers that support them support more than one type of pointer (for example, with names near, far and large) as a compiler extension. In these cases, the pointer may refer to a location in a specific area of memory, and there may be some mapping of values for each type of pointer from the value of the pointer visible by the program to the actual location in the corresponding area of physical memory.
The C compiler is not included in the executable program that it creates (otherwise, to install any firmware, you will also need to install and run the compiler used to create it, or the program will not work). Typically, the compiler no longer works when a program is executed (or at least the program cannot rely on its presence). Therefore, the program cannot access addresses in the address space of the compiler.
In an interpreted environment (for example, C code is interpreted by another program - the interpreter), the interpreter acts as an intermediary between the program and the hardware and processes the mapping between the address space of the program, the address space of the interpreter and physical memory, C translators are relatively rare in practice, compared to instrumental goals that compilers and linkers use.