2011-06-22 89 views
2

我发现这些工种代码:我们什么时候需要和何时传递函数?

hash_init.key  = &hash_key_lc; 

而且

ls->handler = init_connection; 

这里既有hash_key_lcinit_connection的功能,但一个是&其他没有,为什么呢?

UPDATE

所以他们是同样的事情,但什么是理性?

+0

可能的重复[在C中,当作为参数传递时,'&function'和'function'有什么区别?](http://stackoverflow.com/questions/6293403/in-c-what-is-the函数和函数之间的差异当传递为ar) –

回答

1

reference/deference被视为语言的特殊情况c,因为function值得这种特殊情况下,它不能由某个value过去了,你只能通过address/reference通过。

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”。在function

+0

@迈克,但这不一致,一个指针('*')和一个指针指针('**')没有区别? –

+0

如果您有足够的代表,请将副本作为评论发布,而不是答案,并投票结束。 -1 –

+0

@new_perl它不是void(*)(void)'(指向函数的指针)和'void(**)(void)'(指向指向函数的指针),它是'void(void)'(function )和'void(*)(void)'。当作为参数传递时,函数被转换为指向函数的指针。 –

1

见C99部分6.3.2.1,§4:

功能指示符是 表达具有函数类型。 除了当它是 sizeof操作者的操作数或一元& 操作,功能指示器与 类型“”函数返回类型“”是 转换到具有 类型“”函数指针返回一个表达 类型''。

因此,如果foo是一个函数,表达式foo&foo大多可互换的,特别是

foo == &foo 

这类似于如何与阵列型表达式隐式转换为与指针类型表达式。另外,如果fp是一个函数指针,你可以有或无解引用调用它,即表达

(*fp)(42) 

fp(42) 

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

相关问题