Whatever address you use in(user mode i.e. on the top of your operating system) your program are actually virtual/logical address except when you are writing a part of kernel or if you are using an OS without virtual memory support.
e.g.- In assembly
mov eax,[rsi] ; just for example
The mapping of virtual to physical is the job of OS.
The address you use in your programs, the address that your CPU use to fetch data, is not real and gets translated via MMU to some physical address; everyone has one and its size depends on your system(Linux running 32-bit has 4GB address space)
Don't forget to cast the arg to printf to void* when using the address.
Please see my other answer for the standard to use %p specifier for using address in printf