我知道可以使用&
运算符找到变量或函数的内存地址。但是,如果我知道某物在记忆位置2
,我该如何访问它?
例如,如果我声明一个指向 的指针2
,它将被读取为值2
,而不是内存地址2
。
您只需要将其转换为指针:
int *pointerToTwo = (int *)2;
然后你可以像往常一样取消引用:
int valueAtTwo = *pointerAtTwo;
您做这种事情的通常原因是访问内存映射寄存器,在这种情况下,volatile
建议使用关键字:
int valueAtTwo = *(volatile int *)2;
或者也许将所有转换都粘贴到一个宏中,以使您的代码更易于阅读:
#define intValueAt(x) (*(volatile int)(x))
int valueAtTwo = intValueAt(2);
旁白: 2
对于这个用例,几乎可以肯定不是一个有效的地址。我只是因为您在问题中的引用才使用它。
void* pMemory = (void*)2L;
这将创建一个void*
(void 指针) 并将其地址设置为2
.
请注意,如果您的进程不应该访问该内存(您没有读取它的权限),这可能会导致各种错误。另请注意,您不应该随机读取地址。使用指针直接访问内存位置容易出错。这就是为什么软件开发人员开发了如此多的技术来帮助我们仅在正确的情况下使用正确的预期数据类型访问正确的内存地址。
您可以将其转换为 int* 以获取指针,如下所示:
int *ptr = (int *)2;
然后你可以通过普通的 * 操作符访问 2 的内容。
int i = *ptr;
会做你想做的。
但是,值得注意的是,实际上,上面的“i”并不是 RAM 第二个单元格的实际内容。这是因为在用户模式应用程序中,“2”始终被视为虚拟地址,并(在运行时)被转换为物理地址。通常没有办法在类 Unix 操作系统的用户模式代码中做这些事情。