指向函数指针数组的指针

A pointer to array of pointers to function

假设我有一个函数

int foo(void)
{
    printf("Hello world");
}

而我想用一个指向函数的指针来指向foo()

typedef int (*f_ptr)(void);

我会使用其中哪一种情况?

(A) f_ptr my_ptr = foo;
    my_ptr();

(B) f_ptr * my_ptr = foo;
    my_ptr();

现在如果我有 10 个函数 foo1(), foo2() .. foo10() 并且我想将它们放在一个数组中并使用指向函数的指针遍历数组,我该怎么做?

f_ptr my_functions[10] =
{
    foo1,
    foo2,
    ..
    foo10,
};

(A) f_ptr my_ptr = my_functions;   
(B) f_ptr * my_ptr = my_functions;

    for (int x = 0; x < 10; x++)
    {
        my_ptr();
        my_ptr++;
    }

初学者注意这个功能

int foo(void)
{
    printf("Hello world");
}

有 return 类型 int 它 return 什么都没有。相反,你可以写成

int foo(void)
{
    return printf("Hello world");
}

尽管如此,表达式中使用的数组指示符会被转换为指向其第一个元素的指针。

所以如果数组的元素类型

f_ptr my_functions[10];

f_ptr 那么指向数组元素的指针看起来像

f_ptr * my_ptr = my_functions;

因此,例如,您可以使用指针编写一个循环,如

for ( size_t i = 0; i < 10; i++ )
{
    my_ptr[i]();
}

for ( f_ptr *my_ptr = my_functions; my_ptr != my_functions + 10; ++my_ptr )
{
    ( *my_ptr )();
}