a virtual address versus a physical address
Think of a virtual address as the apartment number printed in a tenant's own private directory — 'apartment 12' — and a physical address as the real floor-and-unit the building actually has, say 'floor 7, unit 3'. The tenant only ever speaks in their private numbers; a manager silently converts each one to the real location. A virtual address is the number your program uses; a physical address is the actual spot on the RAM chips.
Every address a normal C program touches is virtual: the stack address rsp points at, the value &x gives you, the pointer returned by malloc(). The hardware, helped by tables the operating system fills in, translates each virtual address into a physical address before the memory chips are actually read or written. The two numbers are usually completely different, and the same physical byte can even have different virtual addresses in different programs (that is how shared libraries are shared). Your program never sees the physical number and normally cannot find it out.
Why keep them separate? Because the indirection is where all the power lives. The OS can move a program's data to a different physical spot, share one physical copy among many programs, mark a page read-only, or even leave a virtual address with no physical home (until it is first touched) — all without the program ever noticing, because the program only knows its stable virtual numbers.
Your program reads virtual address 0x401000. The page table says virtual page 0x401 currently lives in physical frame 0x9c2, so the hardware actually reads physical address 0x9c2000 + the same in-page offset. Next time you run the program, virtual 0x401000 might map to a totally different physical frame.
The virtual number is stable to the program; the physical one is the OS's business.
You almost never see a physical address from user code, and you should not try to — a printed pointer like 0x7ffd... is virtual. Physical addresses are the kernel's and hardware's concern; treating a virtual pointer as a hardware location is a category error.