繁体   English   中英

qsort和bsearch函数…“指针”

[英]qsort and bsearch function…“pointer”

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

int compar(const void *, const void *)

并且我们只是将其名称传递给qsortbsearch的参数之一,这些函数如何识别本质上是随机的单词(因为我们从未明确表示它是函数指针,而是实际函数)并将其用作参数? qsortbsearch的函数声明中是否有明确的qsort

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

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

这意味着,当你通过comparqsort()例如),它实际指向的是获取传递的功能,而不是一些“基本上是随机的字”。


隐式地将函数标识符作为其地址的原因是很久以前的,但是(整个部分是我的假设,基于我想考虑的智能推理,但绝不是确定的),这很可能会因为函数的值没有意义。 带有标识符int i = 5; ,它一个值(5),你也可以用&i得到它的地址。

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

但是它们没有像地址i那样与地址分开的实际内在 因此,早期的编译器(pre-ANSI)仅允许速记xyzzy表示&xyzzy 而且,当然,由于ANSI的最初任务是编纂现有实践而不是创建新的语言,因此他们保留了这种行为。

如果K&R走了另一条路,并决定xyzzy应该是对不传递任何参数的函数的调用,就像xyzzy() ,世界将是一个不同的地方:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM