【问题标题】:Explanation of converting from void* to int in cc 中从 void* 转换为 int 的解释
【发布时间】:2013-05-27 13:42:28
【问题描述】:

在我的代码中:

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

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

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

【问题讨论】:

  • s 打错了,对吧?
  • 感谢您清除 sn-ps,我学会了如何将指针投射到我想要的位置。

标签: c type-conversion


【解决方案1】:

这不是将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 和指针类型的大小可能不同。

【讨论】:

  • 函数假定两个void*指针都指向正确对齐的int对象。这可能是与qsortbsearch 一起使用的比较函数;因为这些函数可以处理任何类型的数组,而 C 没有模板,所以它们使用 void* 作为通用指针类型。
  • 好吧,它要么假设它们是对齐的,要么假设架构可以处理未对齐的访问。
  • 如果架构可以处理未对齐的访问,那么int 对象根据定义是“正确对齐的”。但是,是的,好点。
【解决方案2】:

首先不能取消引用 void 指针。可能是因为它还不知道如何获取数据。 (即)如果它的 char 应该获取 1 个字节,int 4 个字节......

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

(int*) val1;

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

*(int*)val1 

这将为您提供该地址中的数据。

这被正式称为强制转换 "(data_type) data" 将数据强制转换为指定的 data_type;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2015-12-03
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多