-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 上搜索,但找不到答案,我想知道这是如何工作的(我正在尝试制作一个小人计算机风格的模型,并希望为其实现一种高级语言)。
指向对象的指针指向该对象的第一个字节。第一个字节不存储整个对象,而只是第一个字节。对象由多少字节组成由其类型决定。
例如:
#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)
)。