如何在C中定义一个函数指针数组

str*_*str 47 c c++ arrays function-pointers

我有点问题.我正在尝试动态定义一个函数指针数组calloc.但我不知道如何编写语法.非常感谢.

And*_*ess 112

函数指针的类型就像函数声明一样,但用"(*)"代替函数名.所以指向:

int foo( int )
Run Code Online (Sandbox Code Playgroud)

将会:

int (*)( int )
Run Code Online (Sandbox Code Playgroud)

要命名此类型的实例,请将名称放在星号后面的(*)中,以便:

int (*foo_ptr)( int )
Run Code Online (Sandbox Code Playgroud)

声明一个名为foo_ptr的变量,该变量指向此类型的函数.

数组遵循将括号放在变量标识符附近的常规C语法,因此:

int (*foo_ptr_array[2])( int )
Run Code Online (Sandbox Code Playgroud)

声明一个名为foo_ptr_array的变量,它是一个包含2个函数指针的数组.

语法可能会变得非常混乱,因此通常更容易为函数指针创建一个typedef,然后声明一个数组:

typedef int (*foo_ptr_t)( int );
foo_ptr_t foo_ptr_array[2];
Run Code Online (Sandbox Code Playgroud)

在任一样本中,您都可以执行以下操作:

int f1( int );
int f2( int );
foo_ptr_array[0] = f1;
foo_ptr_array[1] = f2;
foo_ptr_array[0]( 1 );
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用以下任一项动态分配数组:

int (**a1)( int ) = calloc( 2, sizeof( int (*)( int ) ) );
foo_ptr_t * a2 = calloc( 2, sizeof( foo_ptr_t ) );
Run Code Online (Sandbox Code Playgroud)

注意第一行中的额外*将声明a1声明为指向函数指针的指针.


And*_*res 5

我在这里放了一个可以帮助你的小例子

typedef void (*fp)(int); //Declares a type of a void function that accepts an int

void test(int i)
{
    printf("%d", i);
}

int _tmain(int argc, _TCHAR* argv[])
{
    fp function_array[10];  //declares the array

    function_array[0] = test;  //assings a function that implements that signature in the first position

    function_array[0](10); //call the cuntion passing 10

}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ode 5

您可以将函数指针数组声明为

T (*afp[N])(); 
Run Code Online (Sandbox Code Playgroud)

对于某些类型T。由于您正在动态分配数组,因此您需要执行类似的操作

T (**pfp)() = calloc(num_elements, sizeof *pfp);
Run Code Online (Sandbox Code Playgroud)

或者

T (**pfp)() = malloc(num_elements * sizeof *pfp);
Run Code Online (Sandbox Code Playgroud)

然后你可以将每个函数称为

T x = (*pfp[i])();
Run Code Online (Sandbox Code Playgroud)

或者

T x = pfp[i](); // pfp[i] is implicitly dereferenced
Run Code Online (Sandbox Code Playgroud)

如果你想非正统,你可以声明一个指向函数指针数组的指针,然后按如下方式分配它:

T (*(*pafp)[N])() = malloc(sizeof *pafp);
Run Code Online (Sandbox Code Playgroud)

尽管在进行调用时必须遵循数组指针:

x = (*(*pafp)[i])();
Run Code Online (Sandbox Code Playgroud)