[英]qsort and bsearch function…“pointer”
我想知道,当我们创建函数时
int compar(const void *, const void *)
并且我们只是将其名称传递给qsort
和bsearch
的参数之一,这些函数如何识别本质上是随机的单词(因为我们从未明确表示它是函数指针,而是实际函数)并将其用作参数? qsort
和bsearch
的函数声明中是否有明确的qsort
?
这与qsort
和bsearch
函数本身无关,而是根据标准C11 6.3.2.1 Language / Conversions / Other operands / Lvalues, arrays, and function designators
,编译器将函数名隐式转换为函数指针:
函数指示符是具有函数类型的表达式。 除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“函数返回指针的指针”的表达式。
这意味着,当你通过compar
到qsort()
例如),它实际指向的是获取传递的功能,而不是一些“基本上是随机的字”。
隐式地将函数标识符作为其地址的原因是很久以前的,但是(整个部分是我的假设,基于我想考虑的智能推理,但绝不是确定的),这很可能会因为函数的值没有意义。 带有标识符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.