C / C ++:如何正确地将“unsigned int *”值转换为“unsigned int”?

时间:2013-02-18 14:08:57

标签: c++ c memory unsigned unsigned-integer

我有一个“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 个答案:

答案 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);

您正在访问指向的值。