As I understand a byte is comprised of 8 bits or byte and it has an address assign to it my question is if I asked for 2 words am I getting then 4 different addresses or do I get one address for the whole Word? Any explanation will be greatly appreciated. thanks
4 回答
通常认为的任何对象或变量的“地址”是该变量中第一个(最低)字节的地址。因此,如果您有一个 std::uint64_t 类型的变量(8 个字节),则指向该变量的指针将指向它的第一个字节,而以下 7 个地址包含其他 7 个字节。现在,这些字节的存储顺序取决于您的实现(查找 little-endian 与 big-endian 架构)。
希望有帮助。
如果您进行分配,那么整个分配都有一个地址,其中的每个字节也有一个地址。
分配中第一个字节的地址等于分配的地址,其余字节具有从那里向上计数的连续地址。
这里的“进行分配”涵盖了全局变量、自动变量new
、、、malloc
任何为特定用途分配内存的东西。用技术术语来说,C 和 C++ 中的每个对象都是一系列具有连续地址的字节。
如果您的系统使用虚拟内存(几乎所有东西都使用),那么地址在虚拟地址空间中是连续的。它们在物理内存中不需要是连续的,但是虚拟内存的全部意义在于你(程序员)可以忽略物理内存中的东西。
在 C 中,除了位域之外的所有对象都由一个或多个字节组成:
C 2011 (N1570) 6.2.6.1 说“除了位字段,对象由一个或多个字节的连续序列组成,其数量、顺序和编码要么明确指定,要么由实现定义。”</p >
当您访问由多个字节组成的对象时,例如int
(通常),该对象的所有字节都会为您访问。
对于处理器硬件本身支持的任何对象,都有加载和存储指令,它们采用单个地址,但对从该地址开始的多个字节进行操作。例如,有“加载字”指令从一个字节的地址开始加载四个字节。(“单词”的大小没有标准;它因计算机体系结构而异。)对于由 C 实现创建的对象(例如具有多个成员的结构对象),C 实现必须使用多条指令加载和存储对象的所有部分。
错过了 as[3],即 't'。而 s[4],即 '\0'