我發現這些工種代碼:我們什麼時候需要和何時傳遞函數?
hash_init.key = &hash_key_lc;
而且
ls->handler = init_connection;
這裏既有hash_key_lc
和init_connection
的功能,但一個是&
其他沒有,爲什麼呢?
UPDATE
所以他們是同樣的事情,但什麼是理性?
我發現這些工種代碼:我們什麼時候需要和何時傳遞函數?
hash_init.key = &hash_key_lc;
而且
ls->handler = init_connection;
這裏既有hash_key_lc
和init_connection
的功能,但一個是&
其他沒有,爲什麼呢?
UPDATE
所以他們是同樣的事情,但什麼是理性?
reference/deference
被視爲語言的特殊情況c
,因爲function
值得這種特殊情況下,它不能由某個value
過去了,你只能通過address/reference
通過。
這等同於以下問題: 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
@邁克,但這不一致,一個指針('*')和一個指針指針('**')沒有區別? –
如果您有足夠的代表,請將副本作爲評論發佈,而不是答案,並投票結束。 -1 –
@new_perl它不是void(*)(void)'(指向函數的指針)和'void(**)(void)'(指向指向函數的指針),它是'void(void)'(function )和'void(*)(void)'。當作爲參數傳遞時,函數被轉換爲指向函數的指針。 –
見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
。
可能的重複[在C中,當作爲參數傳遞時,'&function'和'function'有什麼區別?](http://stackoverflow.com/questions/6293403/in-c-what-is-the函數和函數之間的差異當傳遞爲ar) –