0

我有一个“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 ===

请告诉我,如何正确转换此值,使其在转换过程中不会改变?

4

4 回答 4

4

只需使用*addr. 这是有效的,应该始终有效。如果您需要获取指针的而不是指针指向的值则需要更大的类型。通常 an 的unsigned int*值为 64 位,而unsigned int只有 32 位。

于 2013-02-18T14:12:40.290 回答
1

当你声明一个指针时,比如

unsigned int * addr;

该指针的值将是unsigned int它指向的地址。

当您想获取unsigned int它指向的值时,请使用取消引用运算符*

unsigned int value = *addr;

因此,您在第二个输出行中看到的是addr指向的内容。

于 2013-02-18T14:13:04.763 回答
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);
于 2013-02-18T14:13:04.833 回答
1

你没有改变价值。在

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout); 

您正在访问指针的地址。

fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)address);

您正在访问指向的值。

于 2013-02-18T14:14:08.777 回答