2011-10-16 51 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已经是一个指针。