函数指针的类型与函数声明类似,但函数名用"(*)"代替.因此,一个指向:
int foo( int )
将是:
int (*)( int )
要命名此类型的实例,请将名称放在星号后面的(*)内,因此:
int (*foo_ptr)( int )
声明一个名为foo_ptr的变量,该变量指向这种类型的函数.
数组遵循普通的C语法,将括号放在变量标识符附近,因此:
int (*foo_ptr_array[2])( int )
声明一个名为FOO_PTR_ARRAY的变量,它是一个由2个函数指针组成的array.
语法可能会变得非常混乱,因此通常更容易为函数指针创建一个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声明为指向函数指针的指针.