2014-12-24 109 views
3

我打算使用qsort from stdlib.h。快速排序需要一个比较函数的参数实现这一点:我了解这个C函数(qsort比较函数)吗?

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

我说得对阅读本作,“指针为int-返回函数F F必须考虑两个参数是通用的指针。”?我不确定'* compar'周围的括号的含义 - 有没有我可以查找的名称?

的链接提供了一个示例:

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

我将是正确的阅读*为(int *)一个为“解引用的a的值,它已被铸造为指针的整数后”?

干杯。

回答

8

我正确地读到这个:“一个指向int返回函数f.f的指针必须带有两个泛型指针参数”?

没错。

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

这对于声明函数指针的(这是所谓的“函数指针”)的语法。如果没有括号,这将是一个函数声明

// 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为“提领的价值,它已被强制转换为一个指向整数后”?

再次校正。它给出int地址a

1

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

4

你在正确的道路上。

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

请注,周围没有*compar明确()compar将被视为一个温控功能返回一个int *,接受2个void指针。

对于第二种情况,对于二进制减法运算符-,从C99标准的章节6.5开始。6,第3段,

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

- 两个操作数都是指向合格或不合格版本兼容对象的指针 类型;或

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

和第一点,所述arithmatic type,从章节6.2.5,第18段,

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

所以,在这里,使用指针减法之前,它们是铸造int指针,则解除引用和为被用作操作数整数减法值(一个或多个)。

+0

@ikegami根本不是先生。请把这些话当作鼓励的标志[也是欢呼]。 :-) –