当我浏览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 :(得分:4)
因为initcall_t
本身被定义为函数指针,initcall_t *fn
声明了一个指向函数指针的指针,因此应用*
解引用运算符来获取函数指针。
以下是initcall_t
类型的定义:
typedef int (*initcall_t)(void);
因此类型initcall_t
已经是指针。