gpt4 book ai didi

c - 使用指针的变量地址

转载 作者:太空狗 更新时间:2023-10-29 16:24:15 25 4
gpt4 key购买 nike

考虑以下 C 代码

int x=100;
int*addr=&x;

我知道 addr 将存储 x 的地址。一个一直在我脑海中浮现的问题是 addr 指针将有自己的地址,并且可以再次使用 & 运算符访问它,并且它也将存储在某个地方,所以我们有这里是对地址的无限递归,那么它在哪里结束?

最佳答案

addr 的地址没有明确“存储”在任何地方,它就是这样。如果您要声明第二个变量并使用它来存储该地址,那么请确保它占用空间:

int **addr2 = &addr;

你可以把内存想象成一系列的盒子。假设 4 字节 int 和指针,以及小端字节顺序,您的场景可能如下所示:

+----------+--+--+--+--+
| Address |Data bytes |
+----------+--+--+--+--+
|0x00000000|64|00|00|00|
+----------+--+--+--+--+
|0x00000004|00|00|00|00|
+----------+--+--+--+--+

地址显示在左侧,该位置包含的字节显示在右侧。您可以看到存储在前四个字节中的值 100(十进制的 100 是十六进制的 0x64)。第二个 4 字节位置包含值 0x00000000,这是 x 的地址。地址 0x00000004 没有存储在任何地方。

现在如果我们添加第二个指针,我们会使用更多的内存:

+----------+--+--+--+--+
|0x00000008|04|00|00|00|
+----------+--+--+--+--+

那将是用于表示addr2指针的内存,您可以看到它包含addr的地址,即0x00000004。

使用表达式 *addr2 取消引用 addr2 将产生地址 0x00000004 处的值,即类型为 int * 的 0x00000000。再次取消引用会在该地址生成 int,即 0x00000064。

由于这个内存布局是由编译器选择的,它“知道”所涉及的地址,并且可以直接替换,这样当代码引用 addr2 时,它会生成操作地址 0x00000008 的指令,依此类推.在实际代码中,这可能都发生在堆栈上,但原理是相同的。

最后的注意事项:注意 @Phil Perry的建议;上面的内容简化并具体化了很多本该抽象的东西。这就是它在许多当前架构上的实际工作方式,但是提到的许多事情都不能由 C 保证,因此您不能真正依赖它们始终保持正确。我的意思是上面的例子(希望)使概念稍微不那么模糊。

关于c - 使用指针的变量地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com