我有一个“unsigned int *”值,我需要将它转换为一个简单的“unsigned int”, 所以我可以把它转移到一个功能。但不幸的是, 当我尝试进行简单的转换时,值会发生变化:
Code:
unsigned int * addr;
...
fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout);
fprintf(stdout, "=== casted addr: %08x ===\n", (unsigned int)addr);
Output:
=== addr: fc880000 ===
=== casted addr: 400eff20 ===
请告诉我,如何正确转换此值,以便在转换过程中不会更改?
答案 0 :(得分:4)
只需使用*addr
即可。这是有效的,应该始终有效。如果您需要获取指针的值而不是指针指向的值,则需要更大的类型。通常,unsigned int*
的值为64位,而unsigned int
仅为32位。
答案 1 :(得分:1)
声明指针时,如
unsigned int * addr;
该指针的值将是它指向的unsigned int
的地址。
当您想要获得它所指向的unsigned int
的值时,请使用取消引用运算符*
:
unsigned int value = *addr;
所以你在第二个输出行看到的是addr
指向的内容。
答案 2 :(得分:1)
如果你有一个某种类型的指针,并且你需要将它转换为只是类型,你只需要遵循指针。
void foo(unsigned int some_value);
...
int main()
{
unsigned int * addr = 0x12345678; // some address holding an unsigned int
foo(*addr); // some function taking a unsigned int
无需在此处输入任何内容,因为您没有更改类型。请注意,代码中的“值”不会改变:
// prints the address
fprintf(stdout, "=== addr: %08x ===\n", addr);
// prints the value at that address
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)addr);
答案 3 :(得分:1)
您没有更改该值。在
fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout);
您正在访问指针的地址。
在
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)address);
您正在访问指向的值。