开发者

When do we need & when passing a function?

开发者 https://www.devze.com 2023-03-14 10:24 出处:网络
I found these work types of code: hash_init.key= &hash_key_lc; And ls->handler = init_connection;

I found these work types of code:

hash_init.key       = &hash_key_lc;  

And

ls->handler = init_connection;

Here both hash_key_lc and init_connection are functions,but one is with & the other not,why?

UPDATE

so they are the same thin开发者_运维问答g,but what's the rational??


This is identical to the following question: In C, what is the difference between `&function` and `function` when passed as arguments?

The accepted answer there:

There is no difference. For evidence see the C99 specification (section 6.7.5.3.8).

"A declaration of a parameter as ‘‘function returning type’’ shall be adjusted to ‘‘pointer to function returning type’’, as in 6.3.2.1."


reference/deference on a function is treated as a language special case in c,as function deserves this kind of special case ,it can't be passed by a certain value,you can only pass it by address/reference.


See C99 section 6.3.2.1, §4:

A function designator is an expression that has function type. Except when it is the operand of the sizeof operator or the unary & operator, a function designator with type ‘‘function returning type’’ is converted to an expression that has type ‘‘pointer to function returning type’’.

Thus, if foo is a function, the expressions foo and &foo are mostly interchangeable, in particular

foo == &foo

This is similar to how expressions with array type are implicitly converted to expressions with pointer type. Also, if fp is a function pointer, you can call it with or without dereferencing, ie the expressions

(*fp)(42)

and

fp(42)

are equivalent. Function calls are actually defined in terms of function pointers (section 6.5.2.2 §1) and not function designators, ie as far as language semantics go, *fp in the first example will implicitly converted back to fp before the parens are applied.

0

精彩评论

暂无评论...
验证码 换一张
取 消