我理解这个C函数(qsort比较函数)吗?

时间:2014-12-24 13:21:14

标签: c function-pointers

我打算使用qsort from stdlib.h。 qsort需要一个满足此功能的比较函数参数:

int (*compar)(const void *, const void*)

我正确地读这个,"指向int返回函数f的指针。 f必须带两个参数,这些参数是通用指针"?我不确定括号周围括号的含义。*比较' - 有这个名字,我可以抬头看看吗?

该链接提供了一个示例:

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

我是否正确读取*(int *)a as"取消引用a的值,在它被转换为指向整数的指针之后"?

干杯。

3 个答案:

答案 0 :(得分:8)

  

我是否正确地读到这个,“指向int返回函数f .f的指针必须带两个通用指针的参数”?

完全正确。

  

我不确定*compar 周围括号的含义

这是声明指向函数指针的语法(称为“函数指针”)。没有parens,它将是一个函数声明

// Declares a function named compar. (It returns an int*.)
int *compar(const void *, const void*);

// Declares a function pointer named compar. (The func returns an int.)
int (*compar)(const void *, const void*);
  

我是否正确阅读*(int*)a作为“取消引用a的值,在它被转换为指向整数的指针后”?

再次纠正。它在地址int处提供a

答案 1 :(得分:4)

你走在正确的道路上。

在您的第一个示例中,compar被称为Function pointer()是函数指针的语法的一部分。

请注意,如果()周围没有明确的*compar,则compar将被视为 fucntion 返回int *,接受两个void指针。

对于第二种情况,对于二元减法运算符-,来自C99标准,第6.5.6章,第3段,

  

- 两个操作数都有算术类型;

     

- 两个操作数都是指向兼容对象的限定或非限定版本的指针   类型;或

     

- 左操作数是指向对象类型的指针,右操作数是整数类型。   (递减相当于减去1。)

并且第一点是arithmatic type,来自第6.2.5章,第18段,

  

整数和浮点类型统称为算术类型。

所以,在这里,在使用指针进行减法之前,它们已经转换为int指针,然后取消引用,并且值(被)用作<的操作数em>整数减法。

答案 2 :(得分:1)

是。您正在理解这两种语法。 ()周围的括号*compar表示compar是函数指针。如果没有它,意义将完全不同。