首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qsort和bsearch函数.“指针”

qsort和bsearch函数.“指针”
EN

Stack Overflow用户
提问于 2013-10-03 06:21:27
回答 1查看 185关注 0票数 0

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

代码语言:javascript
复制
int compar(const void *, const void *)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-03 06:34:36

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

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

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

隐式处理函数标识符作为其地址的原因在很久以前就已经存在了,但是(整个部分都是我的假设,基于我想要考虑的智能推理,但在某种程度上是不确定的),这很可能是因为函数的价值是没有意义的。对于标识符int i = 5;,它有一个值(5),您还可以使用&i获取它的地址。

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19152146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档