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

问题描述:

我有一个“无符号int *”值,我需要将它转换为一个简单的“无符号整型”, ,所以我可以将其转换为函数。但不幸的是, 当我尝试做一个简单的演员,价值得到改变:C/C++:如何正确地将“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 === 

请告诉我,如何将这个值正确转换,因此它不会在转换过程中的变化?

+3

...有没有C/C++你使用哪一个? – Mike 2013-02-18 14:10:54

+1

您正在打印两个不同的变量:'addr'和'address'! – 2013-02-18 14:12:14

+0

@Mike C,但C++解决方案也会很有趣。 – 2013-02-18 14:12:22

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

+0

非常感谢!似乎我需要一个更大的类型。演员(长无符号整数)工作完美! – 2013-02-18 14:26:49

+0

我不会说int的大小通常是32.特别是现在有很多64位系统。 – 2013-02-18 14:47:50

+0

@JakeBadlands有两个标准整数类型明确地用于保存指针值:intptr_t和uintptr_t,具体取决于您希望整数值是有符号还是无符号。根据平台的具体情况,其他任何内容都不能保证是合适的大小。 – syam 2013-02-18 14:56:33

当你声明的指针,就像

unsigned int * addr; 

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

当你想要得到的unsigned int的价值它指向您使用引用操作*

unsigned int value = *addr; 

所以你在第二输出线所看到的就是addr点的内容。

如果您有某种类型的指针,并且您需要将其转换为类型,则只需要遵守指针。

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

您没有更改该值。

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

您正在访问指针的地址。

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

您正在访问的价值指向。

+0

对不起,我包含了错误的代码示例。现在修好 – 2013-02-18 14:18:57

+1

好吧,就像别人说的那样,像fprintf一样取消引用你的指针(stdout,“=== castted addr:%08x === \ n”,(unsigned int)(* addr)); – 2013-02-18 14:22:54