常见的 C 编译器将允许您从整数设置指针并使用它访问内存,它们将为您提供预期的结果。但是,这是 C 标准之外的扩展,因此您应该检查编译器文档以确保它支持它。此功能在必须访问特定地址的内存的内核代码中并不少见。它通常在用户程序中没有用。
正如评论所提到的,您可能遇到的一个问题是您的操作系统每次加载程序时都会将程序加载到随机位置。因此,您在一次运行中发现的地址不会是另一次运行中使用的地址。此外,更改源和重新编译可能会产生不同的地址。
为了演示您可以使用指针访问以数字形式指定的地址,您可以检索该地址并在单个程序执行中使用它:
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
int main(void)
{
// Create an int.
int x = 0;
// Find its address.
char buf[100];
sprintf(buf, "%" PRIuPTR, (uintptr_t) &x);
printf("The address of x is %s.\n", buf);
// Read the address.
uintptr_t u;
sscanf(buf, "%" SCNuPTR, &u);
// Convert the integer value to an address.
int *p = (int *) u;
// Modify the int through the new pointer.
*p = 123;
// Display the int.
printf("x = %d\n", x);
return 0;
}
显然,这在普通程序中没有用;这只是一个演示。只有当您有特殊需要访问某些地址时,您才会使用这种行为。