2011-06-22 85 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

相關問題