Обращение по указателям на функции - PullRequest
1 голос
/ 16 октября 2011

Когда я просматривал код 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 ??

1 Ответ

4 голосов
/ 16 октября 2011

Поскольку initcall_t само по себе определено как указатель на функцию, initcall_t *fn объявляет указатель на указатель на функцию, и, таким образом, оператор разыменования * применяется для получения указателя на функцию.

Здесьопределение типа initcall_t:

typedef int (*initcall_t)(void);

Таким образом, тип initcall_t уже является указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...