C 函数指针的解引用
在浏览Linux代码时,我遇到了以下代码段: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
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);