【问题标题】:Complex definition in CC中的复杂定义
【发布时间】:2016-09-10 18:24:57
【问题描述】:

因为我一直很困惑,谁能解释一下下面的例子中*(int*)a*(int*)b是什么,类型转换或一些复杂的指针声明?我需要使用 bsearch 功能。谢谢

int cmpfunc(const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

【问题讨论】:

  • 它将void * 转换为int *,然后解除对它的引用以访问它指向的int。据推测,这些void * 参数指向ints。
  • 表达式中间不能有声明。 (int *) 转换为指向 int 的指针;前面的* 取消引用指针。
  • 附带说明,使用减法检查哪个int 更大是不可靠的,除非您可以确定减法不会上溢/下溢。
  • 您的编译器应该大声疾呼抛弃const 限定符。假设指针确实是int *,则演员表应该是const int *

标签: c pointers casting


【解决方案1】:

这是一个演员表。 a 类型为 const void *,首先转换为 int *,然后将 int * 取消引用以读取 int

分解:

  • a:输入const void *
  • (int *)a:输入int *
  • *(int *)a:输入int

这样做的原因是因为需要将int (*)(const void *, const void *) 类型的函数作为回调传递给bsearchqsort 函数。将参数定义为 const void * 允许 qsort 通过让回调函数将参数转换为适当的类型来对任意数据进行排序。

【讨论】:

    【解决方案2】:

    没有显式(并且可能不安全)强制转换的更具可读性的版本将是

    int cmpfunc(const void * a_, const void * b_)
    {
        int const *a = a_;
        int const *b = b_;
    
        return *a - *b;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多