C++ 中的地址如何一次性引用多个字节?

-2 c++ ram memory-address

每当我使用 C++ 时,我都可以一次“引用”多个字节。例如:

char* charptr = new char;
Run Code Online (Sandbox Code Playgroud)

此行在堆栈上分配一个新变量,即指针charptr,该变量指向堆上的 1 个字节的数据。这是有道理的,因为我的计算机上的物理地址可以存储 1 个字节。

然而,混乱是从这样的一行代码开始的:

int* intptr = new int;
Run Code Online (Sandbox Code Playgroud)

该指针仅包含 8 字节整数的单个地址。

一个地址如何存储多个字节?

我尝试在 StackOverflow 上搜索,但找不到答案,我想知道这是如何工作的(我正在尝试制作一个小人计算机风格的模型,并希望为其实现一种高级语言)。

for*_*818 7

指向对象的指针指向该对象的第一个字节。第一个字节不存储整个对象,而只是第一个字节。对象由多少字节组成由其类型决定。

例如:

#include <iostream>

int main(){
    int x = 42;
    std::cout << sizeof(int) << "\n";
    std::cout << &x << "\n";
}
Run Code Online (Sandbox Code Playgroud)

可能的输出

4
0x7fff8612186c
Run Code Online (Sandbox Code Playgroud)

在记忆中它看起来像这样:

[              int                                ]
[ 1st byte ] [ 2nd byte ] [ 3rd byte ] [ 4th byte ]
 ^
 |
 &x
Run Code Online (Sandbox Code Playgroud)

一个地址如何存储多个字节?

事实并非如此。不要将指针与它们所指向的内容混淆。int占用 4 个字节和指向int, a 的指针int*,保存单个字节的地址并不矛盾。对象占用的内存块的大小以它的类型编码(可以通过 查询sizeof(T))。