编译器如何知道链表中的下一个节点指向哪些节点,因为每个节点的下一个或上一个节点都可以在堆中的任何位置。我可以将特定的内存地址(例如0x00000001(附加到指针并将其绑定到该地址吗?
另外,您可以将特定地址绑定到指针吗?
是的。事实上,这正是指针的目的。内存由数字寻址。第一个字节位于地址 0 中,下一个字节位于 1 中,依此类推。指针本质上是一个存储内存地址的对象,内存地址在内部只是一个数字。
在下面的示例中,我们将对象i
的地址存储到指针中:
int i;
int* ptr = &i;
编译器如何将链表中的地址字符串放在一起
链表节点只是一个结构,其指针指向下一个(如果是双向链表,则为上一个(节点。下一个节点的地址存储在指针中。
编译器如何在运行时分配这些地址?
无论语言不符选择以何种方式分配。该语言未指定"如何"分配内存。方式将根据对象的存储持续时间类别而有所不同。
通常在实践中,语言实现会要求操作系统映射一些内存。具有自动存储的变量存储在所谓的"调用堆栈"中,动态对象存储在"自由存储"中。如何实现其中任何一个都不在我的回答范围之内。我建议研究操作系统和编译器是如何制作的。这是一个广泛的话题。
编译器 [...] 如何在运行时引用这些地址?
它存储地址。有用于访问给定地址的内存的 CPU 指令。
例如,我可以将0x00000001绑定到节点3吗?
我不知道"node3"是什么,但如果你愿意,你可以指向地址 1。除非地址上确实有一个对象,否则您可以使用指针执行太多操作。无法将对象创建到未分配的内存中,也无法从标准C++中的任意地址分配内存。