在我的代码中,我有:
int number_compare(void *val1, void *val2) {
if (*(int*) val1 < *(int*s) val2) {
所以基本上要从 void* 转换为 int 我必须转换 *(int *)。
这有效并给了我正确的结果,有人可以告诉我为什么,或者指向一个解释它的线程。我已经看过并且找不到我理解的答案。
在我的代码中,我有:
int number_compare(void *val1, void *val2) {
if (*(int*) val1 < *(int*s) val2) {
所以基本上要从 void* 转换为 int 我必须转换 *(int *)。
这有效并给了我正确的结果,有人可以告诉我为什么,或者指向一个解释它的线程。我已经看过并且找不到我理解的答案。
那不是将 a 转换void *
为int
. 它将void *
指向的任何内容解释为int
. 分解它:
val1 // void pointer - not dereferenceable
(int *)val1 // pointer to 'int'
*(int *)val1 // the 'int' being pointed to
所以你的函数被传递了两个指针:然后它将它们解释为指向并取消引用它们,比较被指向int
的两个值。int
相反,从 a 转换void *
为 anint
看起来像这样:
int x = (int)val1;
但这几乎肯定不是你想要的——首先是因为int
有符号,而指针没有,其次是因为int
指针类型可能不同大小。
首先不能取消引用 void 指针。可能是因为它还不知道如何获取数据。(即)如果它的 char 应该获取 1 个字节,int 4 个字节......
因此,首先您将一些地址(空指针)转换为 int 指针。
(int*) val1;
稍后从该地址获取值 [现在系统知道它应该从该地址获取 4 个字节的数据:val1]。
*(int*)val1
这将为您提供该地址中的数据。
这被正式称为将“(data_type)数据”转换为指定的data_type;