O espaço de endereço que seu programa vê é SEMPRE virtual. (Pelo menos em todos os sistemas operacionais modernos.)
Você aloca memória chamando a API do sistema operacional para isso (ou o compilador faz isso quando você define variáveis em seu código).
Os endereços (ou ponteiros, qualquer que seja a linguagem de programação que os chama) que você retorna para essa memória alocada, são válidos no contexto do seu programa.
Para a memória que você alocou, você é responsável por retorná-lo ao sistema operacional. Se o compilador fez coisas em seu nome, o compilador também terá incluído a limpeza necessária.
Quando o seu programa sai, o SO também fará alguma limpeza.
Onde os dados reais do programa residem na RAM física do computador é completamente acadêmico. Seu sistema operacional mapeará o espaço de endereço virtual que seu programa vê na RAM física e / ou no espaço de troca. Você mesmo simplesmente não pode saber como isso é feito a qualquer momento.
Pode ser importante se você estiver programando um driver de dispositivo ou um componente do kernel, mas obviamente você não tem o conhecimento necessário sobre sistemas operacionais e programação para isso. Isso está claro na sua pergunta.
Esse software opera em um nível diferente e pode ter que interagir com a RAM física real. Existem métodos especiais e APIs para lidar com isso, mas você nunca encontrará aqueles em um programa normal escrito pelo usuário.
Outra possibilidade é quando você está fazendo programação de baixo nível em um dispositivo embutido, onde não há sistema operacional para fornecer essa camada de abstração entre RAM virtual e física. Novamente: isso é algo para especialistas.
Isso simplesmente não é algo com o qual você terá que se preocupar se escrever programas corretos de acordo com as regras da linguagem de programação.
Claro: se o seu programa está incorreto (por exemplo, acessa a memória que nunca alocou), o programa pode falhar ou será encerrado pelo próprio SO, se o sistema operacional descobrir que o programa está se comportando mal. Descobrir o que deu errado e corrigir o problema no programa é um aspecto importante da programação. Isso é chamado de depuração.