我想知道是否可以通过C中的内存地址访问变量。 例如,我创建一个变量" aa"然后我通过printf和& aa打印其内存地址...假设它的地址是12345。 有没有办法通过仅使用12345而非指针获取变量,如下所示:
printf("%d", 12345);
通过这种方式,我希望指令打印" aa"。
对不起,如果不清楚,我会告诉你代码:
int main()
{
int aa=1; //assume its adress is 12345
printf("%d", 12345); // I want to use 12345 as parameter to print the variable
}
非常感谢。
答案 0 :(得分:1)
假设您的变量的地址绝对是12345
:
printf("Value at the address %d:%d", 12345, *(int*)12345);
以更一般的方式:
int aa = 10; // Your variable 'aa'
int* aa_ptr = &aa; // 'aa_ptr' contains the address of the variable aa.
printf("The variable 'aa' is at the address %p and contains the value: %d", aa_ptr, *aa_ptr); // '*aa_ptr' would show the value of the variable 'aa'
内存的地址在C 中称为“指针”。有关更多解释,请查看C 中指针的概念:first tutorial in google
注意:对于您的信息变量通常至少8位对齐(更常见的是32位对齐) - 地址应为偶数。因此,您不太可能在12345
,12344
或12346
等奇数地址处看到变量地址更有可能是有效地址。访问不对齐的地址有时会导致程序崩溃。
答案 1 :(得分:1)
这就是指针:
int aa = 12 ; // defines an integer variable
int *pt = &aa; // declare a pointer to the above variable
printf("Variable aa is at address %p\n", pt);
printf("Its value is %d\n", *pt);
在实模式编程中,当硬件寄存器映射到众所周知的位置时,在指针中存储绝对地址甚至是合法的:
char * screenmem = 0xB800; // absolute address of the screen text buffer on a PC in REAL MODE
screenmem[0] = 'A'; // writes a A in upper left corner
但除了:
取消引用指向任意地址(int * pt = 12345; *pt = 12;
)的指针会调用Undefined Behavior。
答案 2 :(得分:0)
嗯,为了理论,是的,你可以做到。您应该问自己的问题是为什么或何时需要它?
您期望的一种方式可以完成:
int var = 0;
int * pVar = NULL;
pVar = &var;
printf ("The address is %p\n", (void *)&var);
printf ("The same address (via pointer variable) is %p\n", (void *)pVar );
printf ("The value at the address is %d\n", *(&var));
printf ("The value at the address (via pointer) is %d\n", *pVar );