我们什么时候需要&通过功能时?

时间:2011-06-22 10:01:03

标签: c function-pointers

我找到了这些工作类型的代码:

hash_init.key       = &hash_key_lc;  

ls->handler = init_connection;

此处hash_key_lcinit_connection都是函数,但其​​中一个是&而另一个不是,为什么?

更新

所以他们是一回事,但理性是什么?

3 个答案:

答案 0 :(得分:2)

这与以下问题相同: In C, what is the difference between `&function` and `function` when passed as arguments?

那里接受的答案是:

  

没有区别。为了证据   请参阅C99 specification(部分   6.7.5.3.8)。

     

“参数声明为   ''函数返回类型''应该是   调整为''指向功能的指针   返回类型'',如6.3.2.1。“

答案 1 :(得分:1)

reference/deference上的{p> function被视为c中的语言特殊情况,因为function值得这种特殊情况,它不能通过某些value,您只能通过address/reference传递。

答案 2 :(得分:1)

见C99第6.3.2.1节,§4:

  

函数指示符是一个   具有函数类型的表达式。   除非是操作数   sizeof运算符或一元&   运算符,函数指示符   类型''函数返回类型''是   转换为具有的表达式   键入''返回函数的指针   ””。

因此,如果foo是一个函数,则表达式foo&foo几乎可以互换,特别是

foo == &foo

这类似于将具有数组类型的表达式隐式转换为具有指针类型的表达式。此外,如果fp是一个函数指针,您可以使用或不使用解除引用来调用它,即表达式

(*fp)(42)

fp(42)

是等价的。函数调用实际上是根据函数指针(第6.5.2.2节§1)定义的,而不是函数指示符,即就语言语义而言,第一个示例中的*fp将隐式转换回fp在应用parens之前。