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 ===
请告诉我,如何将这个值正确转换,因此它不会在转换过程中的变化?
只需使用*addr
。这是有效的,应该始终有效。如果您需要获取指针的值而不是指针指向的值,则需要更大的类型。通常,unsigned int*
的值是64位,而unsigned int
只有32位。
非常感谢!似乎我需要一个更大的类型。演员(长无符号整数)工作完美! – 2013-02-18 14:26:49
我不会说int的大小通常是32.特别是现在有很多64位系统。 – 2013-02-18 14:47:50
@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);
您正在访问的价值指向。
对不起,我包含了错误的代码示例。现在修好 – 2013-02-18 14:18:57
好吧,就像别人说的那样,像fprintf一样取消引用你的指针(stdout,“=== castted addr:%08x === \ n”,(unsigned int)(* addr)); – 2013-02-18 14:22:54
...有没有C/C++你使用哪一个? – Mike 2013-02-18 14:10:54
您正在打印两个不同的变量:'addr'和'address'! – 2013-02-18 14:12:14
@Mike C,但C++解决方案也会很有趣。 – 2013-02-18 14:12:22