2011-08-27 98 views
2

内存地址如何工作?C++内存地址?

在32位内存地址是一个十六进制值,如0x0F032010,对不对?但是,这些值指向字节或位?

和两个内存地址之间是什么样的像0x0F032010和0x0F032011

+1

请相信我,我的朋友,真正理解你将不得不迟早阅读一些沉重的书。来自SOF的四行答案不会让你走得更远... 我最喜欢的操作系统书籍作者:Tannenbaum。您也可以从Silberschatz,Galvin,Gagne开始 –

+2

两个内存地址之间没有任何内容,这就是为什么使用浮点值进行指针算术会给我编译错误的原因! GRR! – Marlon

+1

也许一堆亚原子粒子? :P –

回答

10

在32位的内存地址是一样的0x0F032010十六进制值,对不对?

它是一个数字。内存中的位置。它以记忆的开始和结束为界,记忆开始于某个值并以某个值结束。

但是,这些值指向字节或位?

通常认为地址指向最小的可寻址单元,这是一个字节。大多数现代CPU都是这样定义的。但情况并非总是如此。

而像0x0F032010和0x0F032011

龙两个内存地址之间是什么样的。或者什么也没有,因为它们之间没有任何东西。

+8

+1自1992年以来,那里没有龙。正式。 – MByD

1

在C和C++中,地址最终指向的内容大小与char相同 - “字节”。这是语言中的处理级别。这是否真的是机器中的寻址水平是另一个问题。一个字节中的位数是另一个问题。该标准指定了一个最小值。

0

这些值本身没有任何意义,只是数字。内存地址只是一个对应于内存字节的数字,比如你家的街道地址。这只是一个数字。

地址可以指向的最小单位是一个字节,所以地址指向字节;你可以考虑指向你房子左侧的地址;实际的房子(组成该字节的位)在你的地址(指向你房子的左侧)和你的隔壁邻居的地址(指向他房子的左侧)之间。但是在那里没有任何其他地址。

1

C++(或C)地址或指针值最好被认为是指向一个对象,而不是(必然)指向一个字节。指针运算是根据指向对象的大小定义的,因此递增int*值会为您提供一个指向相邻对象(可能位于内存更远处的4个字节)的指针。

在机器级上,假设一个典型的线性单片字节寻址内存模型,指针被实现为机器地址,每个地址实际上是一个指向单个字节的数字。一个int*指针值包含它指向的int对象的第一个字节的地址。通过将sizeof (int)(比如4)加到机器地址来实现递增C++ int*指针。

就C++而言,指针不是整数;他们只是指针。您可以使用强制转换来在指针值和整数值之间进行转换,并且结果应该对于底层机器的内存模型而言是有意义的,但对结果的保证不会太多。您可以对指针执行算术运算,但是在语言级别上,它与整数运算完全不同(尽管它可能在计算机级别上以缩放整数算术实现)。

我描述的内存模型不是唯一可能的,并且C和C++都是故意设计的,以允许其他模型。例如,你可以有一个模型,其中每个单独的对象都有自己的内存空间,而指针或地址是一个复合值,它由标识该对象的东西加上该对象内的偏移量组成。给定int x; int y;,您可以比较他们的地址是否相等(&x == &y将为false),但&x < &y的行为未定义;甚至不需要&x < &y&y < &x具有相反的值。

C++内存模型在典型的32位平面内存模型上工作得非常好,你可以将指针看作数字。但是C++模型足够抽象,它也可以在其他模型之上工作。

您可以根据语言定义的抽象术语或机器实现的具体术语思考指针和地址。他们完全不同,但最终是兼容的心智模式。同时保持他们在你的头上可能会很棘手。