我有点问题。
我正在尝试使用calloc
动态定义一个函数指针数组。
但我不知道如何编写语法。
非常感谢。
答案 0 :(得分:108)
函数指针的类型就像函数声明一样,但用“(*)”代替函数名。所以指向:
的指针int foo( int )
将是:
int (*)( int )
为了命名此类型的实例,请将名称放在星号后面的(*)中,以便:
int (*foo_ptr)( int )
声明一个名为foo_ptr的变量,该变量指向此类型的函数。
数组遵循将括号放在变量标识符附近的常规C语法,所以:
int (*foo_ptr_array[2])( int )
声明一个名为foo_ptr_array的变量,它是一个包含2个函数指针的数组。
语法可能会变得非常混乱,因此通常更容易为函数指针创建一个typedef,然后声明一个数组:
typedef int (*foo_ptr_t)( int );
foo_ptr_t foo_ptr_array[2];
在任何一个样本中,您都可以执行以下操作:
int f1( int );
int f2( int );
foo_ptr_array[0] = f1;
foo_ptr_array[1] = f2;
foo_ptr_array[0]( 1 );
最后,您可以使用以下任一项动态分配数组:
int (**a1)( int ) = calloc( 2, sizeof( int (*)( int ) ) );
foo_ptr_t * a2 = calloc( 2, sizeof( foo_ptr_t ) );
注意第一行中的额外*,将a1声明为指向函数指针的指针。
答案 1 :(得分: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
}
答案 2 :(得分:4)
你将一个函数指针数组声明为
T (*afp[N])();
某些类型T
的。由于您正在动态分配数组,因此您需要执行类似
的操作T (**pfp)() = calloc(num_elements, sizeof *pfp);
或
T (**pfp)() = malloc(num_elements * sizeof *pfp);
然后您将每个函数调用为
T x = (*pfp[i])();
或
T x = pfp[i](); // pfp[i] is implicitly dereferenced
如果你想要非正统,你可以声明一个指向函数指针数组的指针,然后按如下方式分配:
T (*(*pafp)[N])() = malloc(sizeof *pafp);
虽然在进行调用时你必须遵循数组指针:
x = (*(*pafp)[i])();
答案 3 :(得分:1)
假设您的所有函数都是void ()(void)
类型,就像这样
typedef void (*fxptr)(void);
fxptr *ptr; // pointer to function pointer
ptr = malloc(100 * sizeof *ptr);
if (ptr) {
ptr[0] = fx0;
ptr[1] = fx1;
/* ... */
ptr[99] = fx100;
/* use "dynamic array" of function pointers */
free(ptr);
}
答案 4 :(得分:1)
typedef R (*fptr)(A1, A2... An);
其中R是返回类型,A1,A2 ...... An是参数类型。
fptr* arr = calloc(num_of_elements,sizeof(fptr));