9

如果我在 C 中定义一个变量(即 unsigned short int n = 5),则该值以二进制形式存储在用户 RAM 中的某处(在这种情况下,它看起来像 0000 0000 0000 0101)。存储该值的位置也有一个二进制地址。(即,值 5 可以存储在 0010 中,这意味着它在 ram 中同时使用 0010 和 0011,因为它使用 2 个字节)。变量 n 的名称表示存储该值的内存地址。该内存地址存储在哪里?这不会占用更多的内存吗?如果确实如此,那么该地址是否也必须具有地址?

4

2 回答 2

21

变量的内存地址不直接存储在内存中。它是访问变量的代码的一部分。根据具体情况,它可以是偏移量(与已知位置的距离 - 例如局部变量的堆栈指针,对于全局变量,它可能是程序计数器)或绝对地址(仅适用于全局变量)。

如果您想要一个变量来存储变量的地址,那么是的,您也需要该变量的内存。这种类型的变量称为指针。

于 2012-12-23T21:33:46.710 回答
1

这取决于几个因素,例如分配方法(堆栈或静态),如何访问变量,但让我们假设这段代码:

static int n = 5;
printf("%p\n", &n);

在这种情况下,地址n被存储在printf被调用的代码段中。如果你反汇编代码,你会发现一条push指令,将地址压入堆栈,就在调用printf. 被推送的地址是n(它是被推送的两个地址之一,还有格式字符串)的地址。

正如我上面所说,它并不总是相同的方式。不同的架构和编译标志(例如-fpic)可以改变它。
此外,如果变量在堆栈上,或者如果对它的引用不是来自代码,而是来自数据(例如int n=5; int *p = &n;),事情就会改变。

于 2012-12-23T21:38:23.467 回答