qsort和bsearch函数......“指针”

时间:2013-10-03 06:21:27

标签: c function-pointers qsort bsearch

我想知道,当我们创建函数

int compar(const void *, const void *)

我们只是将其名称传递给qsortbsearch的一个参数,这些函数如何识别基本上随机的单词(因为我们从未明确声明它是一个函数指针,而是一个实际的功能)并将其用作参数?在qsortbsearch的函数声明中是否存在显式强制转换?

1 个答案:

答案 0 :(得分:3)

这与qsortbsearch函数本身无关,而是函数名由编译器按照标准C11 6.3.2.1 Language / Conversions / Other operands / Lvalues, arrays, and function designators隐式转换为函数指针:{/ p >

  

函数指示符是具有函数类型的表达式。除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数。运算符,类型为“函数返回类型”的函数指示符将转换为具有“指向函数返回类型的指针”类型的表达式。

这意味着,当你将compar传递给qsort()时(例如),它是传递给函数的实际指针,而不是一些“基本上随机的单词”。


隐含地将函数标识符作为其地址处理的原因在很久以前就已存在但是(并且这整个部分是我自己的假设,基于我想要考虑的智能推理,但绝不是确定的)这可能是因为函数的值没有意义。使用标识符int i = 5; 一个值(5),您还可以使用&i获取其地址。

但是,对于函数,它们实际上没有这样的值。您可以将它们称为生成xyzzy(),然后您可以获取其地址&xyzzy,以便稍后通过函数指针进行调用。

但他们没有像整数i那样与其地址分开的真正的内在。所以早期的编译器(ANSI之前)只允许简写xyzzy表示&xyzzy。当然,由于ANSI的最初授权是编纂现有的实践而不是创造一种新的语言,因此他们保留了这种行为。

如果K&amp; R走了另一条路,并决定xyzzy应该调用函数不传递任何参数,与xyzzy()相同,那么世界将是另一个地方: - )< / p>