C ++有什么区别uint64和* uint64?

时间:2010-03-27 21:30:40

标签: c++

为什么:

const char example;

(uint64*)example的值为140734799798420

*(uint64*)example的值为7004431430466964258

P.S。不要担心类型转换,我感兴趣为什么第二个*增加了值。

由于

2 个答案:

答案 0 :(得分:8)

您的代码提供了未定义的行为。你的第二行非法地将一个字符转换为指向uint64的指针(很可能是一个无效的指针)。您的第三行尝试取消引用此无效指针。

询问为什么它做它的功能是没有意义的 - 它可以在不同的机器上做不同的事情,并且在下一版本的编译器中行为可能会改变。

就是不要这样做。

答案 1 :(得分:4)

正如其他人所说,你已经调用了未定义的行为。没有特别的行为可以保证。

也就是说,您会看到不同的值,因为您在内存中打印不同的位置 - 第一个打印数据来自存储example的内存位置,第二个打印存储位置的数据作为example的值

const char example

在堆栈上定义char变量而不初始化它,因此它的值将是垃圾;可能是最后存储在堆栈中分配位置的任何内容。

(uint64 *)example

example的值解释为指向uint64(的地址)的指针。这会打印出example中存储的值,就好像它是指针一样。

*(uint64 *)example

取消引用指针。它将example的值解释为指向uint64(的地址)的指针,然后打印该地址处的内容,就好像它是uint64一样。