我打算使用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的值,在它被转换为指向整数的指针之后"?
干杯。
答案 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
是函数指针。如果没有它,意义将完全不同。