内存地址如何工作?
在32位内存地址是十六进制值,如0x0F032010,对吗?但这些值是指向字节还是位?
两个存储器地址如0x0F032010和0x0F032011
之间的区别答案 0 :(得分:10)
在32位内存地址是十六进制值,如0x0F032010,对吗?
这是一个数字。记忆中的一个位置。它受到内存的开始和结束的限制,它从某个值开始并以某个值结束。
但这些值是指向字节还是位?
通常认为地址指向最小的可寻址单元,即一个字节。大多数现代CPU都是以这种方式定义的。然而情况并非如此。
两个存储器地址如0x0F032010和0x0F032011
之间的区别
龙。或者没有,因为它们之间没有任何东西。
答案 1 :(得分:1)
在C和C ++中,地址最终指向与char
- “字节”大小相同的内容。这就是语言中的寻址水平。这真的是手头机器中的寻址水平是一个不同的问题。字节中的位数是另一个问题。该标准规定了最小值。
答案 2 :(得分:1)
C ++(或C)地址或指针值最好被认为是指向对象,而不是(必然)指向一个字节。指针算法是根据指向对象的大小定义的,因此递增int*
值会为您提供指向相邻int
对象的指针(可能是4个字节,更远的地方)存储器)。
在机器级别,假设一个典型的线性单片字节寻址存储器模型,指针实现为机器地址,并且每个地址实际上是一个引用单个字节的数字。 int*
指针值包含它指向的int
对象的第一个字节的地址。通过将int*
(例如4)添加到机器地址来实现递增C ++ sizeof (int)
指针。
就C ++而言,指针不是整数;他们只是指针。您可以使用强制转换在指针值和整数值之间进行转换,结果 在底层机器的内存模型方面应该是有意义的,但对结果的保证不多。您可以对指针执行算术运算,但语言级别与整数运算完全不同(尽管它可能在机器级别上实现为缩放整数运算)。
我所描述的内存模型并不是唯一可能的内存模型,C和C ++都是故意设计的,以允许其他模型。例如,您可以拥有一个模型,其中每个单独的对象都有自己的内存空间,而指针或地址是一个复合值,由标识对象的内容和该对象中的偏移量组成。给定int x; int y;
,您可以比较它们的相等地址(&x == &y
将为false),但&x < &y
的行为未定义;甚至不要求&x < &y
和&y < &x
具有相反的值。
C ++内存模型在典型的32位平面内存模型上运行得非常好,而可以将指针视为数字。但是C ++模型足够抽象,它也可以在其他模型之上工作。
您可以在语言定义的抽象术语中或在机器实现的具体术语中考虑指针和地址。它们是完全不同的,但最终是兼容的心理模型。同时将它们放在头脑中可能会很棘手。
答案 3 :(得分:0)
这些价值观本身并不算数字。内存地址只是一个与内存字节对应的数字,就像你家的街道地址一样。这只是一个数字。
地址可以指向的最小单位是一个字节,因此地址指向字节;你可以想到指向你家左侧的地址;实际的房子(构成字节的位)在你的地址(指向你家的左侧)和隔壁邻居的地址(指向他家的左侧)之间。但那里没有任何其他地址。