C ++:什么是指针的十六进制值相对于?

时间:2014-01-04 20:30:16

标签: c++ pointers

在C ++(32位程序)中,您可以获得指针的十六进制值,如下所示:

Class myClass;
DWORD hexValue = (DWORD)&myClass;

十六进制值可能看起来像0xFF225290

这个值相对于什么?所有内存的开始,进程的开始(在内存中),类的开始还是其他什么?

编辑:我不相信我很清楚。通过“相对”我的意思是,如果我有一个指向0x0000的指针,它会在进程的内存开头还是系统的内存中?

我知道内存本身就是分散的,我的问题只是指针编号值。当你得到指向某个东西的指针时,分配给整个系统范围内的指针的数字,还是仅仅是本地进程的本地内存堆?正如一个答案所提到的,在“现代操作系统”中,每个进程都有自己的虚拟内存。这表明0x0000位于进程虚拟堆的开头,而不是物理内存的开头。这是我的问题。

2 个答案:

答案 0 :(得分:1)

这与任何事都无关。它是一个表示内存中地址的值。

大多数现代计算机都有一个连续的地址空间;在这种情况下,你可以说它与那个空间的起点“相对”。但事实并非如此 - 在嵌入式系统中,并且可能在将来,可能会有更复杂的地址空间。

回答你的意思,但没有问:在大多数现代计算机平台上,每个进程都有自己的虚拟地址空间,因此一个进程的指针在另一个进程中没有意义。

答案 1 :(得分:0)

您不能说指针与现代系统上的任何内容相关:指针与进程的虚拟内存空间中的地址无关。这个虚拟内存地址空间是操作系统在硬件的帮助下完全抽象出来的东西。

实际上,虚拟内存地址空间中连续的地址范围甚至不需要在物理内存中连续,虚拟内存(称为页面)的各个部分可以自由地分散在物理内存中,操作系统可以随意分发它们。这打破了指针相对于任何事物的任何概念。