它是如何在内存中使用指针的?

How does it work in memory with pointers and in general?

本文关键字:指针 内存      更新时间:2023-10-16

假设我有一个指向 c++ int型的指针。

int i = 1;
int* myInt = &i;

myInt中,我有内存位置的信息来获得实际的整数值。我猜myInt中的信息必须存储在内存中。

但是编译器如何知道myInt在内存中的位置?我猜它必须在内存中保留myInt的地址。但是最后的信息保存在哪里呢?Memoryinception ?

这更像是一个关于如何管理内存的一般性问题。

编译器知道myInt在哪里,因为它把它放在第一位。在编译过程中,使用一种称为符号表的数据结构来跟踪这些位置。编译代码只包含地址而不包含变量名(或词法名)。

每个变量都有自己的内存地址,不管它包含什么。因此,当您存储指向整数的指针时,您只是存储指向该变量数据的地址。这个地址容器也有一个地址。您可以通过创建指针到指针的方式进行试验,并显示您满意的结果:

int i = 1;
int* pointer = &i;
cout << "address1:[" << &i << "] address2:[" << &pointer << "]n";

每个变量都有一个地址。

全局变量和静态变量相对于"loader"放置在内存中的整个模块寻址。Loader读取"模块重定位表",其中包含代码中需要更正地址的位置,并更正这些位置。Google:位置独立代码。

自动变量(在函数体中声明)相对于激活记录进行寻址。每次调用函数时,激活记录都被压入堆栈,堆栈是所有自动变量的"结构"。激活记录的地址存储在硬件寄存器中,用于对每个变量进行寻址。

包括指针在内的所有局部变量都存储在堆栈中。编译后的代码使用堆栈指针相对寻址来访问它们。第一个变量的位置是0+sp,第二个变量的位置是第一个变量的大小+sp,等等

i的实际地址和myInt的实际地址直接嵌入到机器码中,嵌入到访问i的实际机器命令和访问myInt的实际机器命令中。

这些最终地址不存储在数据存储器中。相反,它们被直接嵌入到流经CPU的机器命令流中。它们被称为"直接操作数"。CPU与实际的机器命令一起接收这些地址,因此CPU不必从数据内存中的其他位置检索它们。

这就是这个看似"无限"的递归停止的原因。这就是它如何触底的。

对于全局变量,确切的地址是在编译时知道的,并直接嵌入到机器命令中。对于局部变量,当前堆栈帧中的地址偏移量在编译时是已知的,并且直接嵌入到机器命令中。