2011-10-16 48 views
1

當我在瀏覽Linux的代碼中,我遇到了下面的代碼片段:取消引用函數指針的

static void __init do_initcalls(void) 
{ 
initcall_t *fn; 

for (fn = __early_initcall_end; fn < __initcall_end; fn++) 
    do_one_initcall(*fn); 
} 

initcall_t是一個函數指針。

do_initcalls的原型是int do_one_initcall(initcall_t fn)

所以我認爲援引do_initcalls就像do_one_initcall(fn)但我看到它是do_one_initcall(*fn)。那爲什麼*fn而不是fn

+0

你爲什麼這麼認爲?你自己說過:'do_one_initcall'需要一個'initcall_t'類型的參數。然而你不知何故會傳遞一個'initcall_t *'參數給它。爲什麼?如果期望一個'initcall_t',你必須傳遞'initcall_t'。就這樣。如果不瞭解你問的是什麼奇怪的邏輯,就無法回答你的問題。爲什麼要將'initcall_t *'傳遞給需要'initcall_t'的函數呢? – AnT

+0

OMG誰upvotes?! – nc3b

+2

@ nc3b:我提高了它以補償downvote。由於問題明確表達和格式良好,我認爲沒有理由下調。迷惑或不知道某事是提問的全部目的。 –

回答

4

由於initcall_t本身被定義爲一個函數指針,因此initcall_t *fn聲明瞭一個指向函數指針的指針,因此解引用操作符被用於獲取函數指針。

這裏是initcall_t類型的定義:

typedef int (*initcall_t)(void); 

所以類型initcall_t已經是一個指針。