C 函数指针的解引用

C 函数指针的解引用,c,linux,linux-kernel,C,Linux,Linux Kernel,在浏览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_initcallinitcall\t fn 所以我认为调用do_in

在浏览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_initcallinitcall\t fn

所以我认为调用do_initcalls就像do_one_initcallfn一样,但我看到它是do_one_initcall*fn。为什么是*fn而不是fn???

因为initcall\t本身被定义为函数指针,initcall\t*fn声明指向函数指针的指针,因此应用*dereference操作符来获取函数指针

以下是initcall\t类型的定义:

因此类型initcall已经是一个指针。

因为initcall本身被定义为函数指针,initcall\t*fn声明一个指向函数指针的指针,因此应用*dereference操作符来获取函数指针

以下是initcall\t类型的定义:


因此initcall类型已经是指针了。

为什么这样认为?您自己说过:do_one_initcall需要initcall类型的参数。然而,您不知何故希望将initcall\u t*参数传递给它。为什么?如果它需要initcall,则必须传递initcall。这就是全部。如果你不明白是什么奇怪的逻辑让你这么问,你就无法回答你的问题。为什么你要将initcall\u t*传递给一个需要initcall\u t的函数?@nc3b:我对它进行了上表决,以补偿下表决。既然问题表达得很清楚,格式也很好,我看不出有理由投反对票。困惑或不知道是提问的全部目的。@BlagovestBuyukliev好吧,我想这是明智的。你为什么这么认为?您自己说过:do_one_initcall需要initcall类型的参数。然而,您不知何故希望将initcall\u t*参数传递给它。为什么?如果它需要initcall,则必须传递initcall。这就是全部。如果你不明白是什么奇怪的逻辑让你这么问,你就无法回答你的问题。为什么你要将initcall\u t*传递给一个需要initcall\u t的函数?@nc3b:我对它进行了上表决,以补偿下表决。既然问题表达得很清楚,格式也很好,我看不出有理由投反对票。困惑或不知道是提问的全部目的。@BlagovestBuyukliev好吧,我想这是明智的。
typedef int (*initcall_t)(void);