在我的代码中我有:
int number_compare(void *val1, void *val2) {
if (*(int*) val1 < *(int*s) val2) {
所以基本上从void *转换为int我必须转换*(int *)。
这有效并且给我正确的结果,有人可以告诉我为什么,或者指向我解释它的线程。我已经看了,找不到我理解的答案。
答案 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;