c中从void *转换为int的说明

时间:2013-05-31 16:59:49

标签: c type-conversion

在我的代码中我有:

int number_compare(void *val1, void *val2) {
    if (*(int*) val1 < *(int*s) val2) {

所以基本上从void *转换为int我必须转换*(int *)。

这有效并且给我正确的结果,有人可以告诉我为什么,或者指向我解释它的线程。我已经看了,找不到我理解的答案。

2 个答案:

答案 0 :(得分:7)

这不是将void *转换为int。它将void *指向的任何内容解释为int。分解:

val1           // void pointer - not dereferenceable
(int *)val1    // pointer to 'int'
*(int *)val1   // the 'int' being pointed to

所以你的函数被传递了两个指针:然后它将它们解释为int的指针并取消引用它们,比较指向的两个int值。

相比之下,从void *转换为int看起来像这样:

int x = (int)val1;

但这几乎肯定不是你想要的 - 首先是因为int是签名而指针不是,第二是因为int和指针类型可能不是相同的大小。

答案 1 :(得分:2)

第一件事情无效指针无法解除引用。也许是因为它还不知道如何获取数据。 (即)如果它的char应取1个字节,则为4个字节......

所以首先你要将一些地址(void指针)转换为int指针。

(int*) val1;

稍后从该地址获取值[现在系统知道它应该从该地址的4个字节中获取数据:val1]。

*(int*)val1 

这将给你那个地址的数据。

这正式被称为投射“(data_type)数据”将数据转换为指定的data_type;