函数指针

指针也可用于指向功能。

我们来看一个基本功能:

int my_function(int a, int b)
{
    return 2 * a + 3 * b;
}

现在,让我们定义该函数类型的指针:

int (*my_pointer)(int, int);

要创建一个,只需使用此模板:

return_type_of_func (*my_func_pointer)(type_arg1, type_arg2, ...)

然后我们必须将此指针指定给函数:

my_pointer = &my_function;

此指针现在可用于调用该函数:

/* Calling the pointed function */
int result = (*my_pointer)(4, 2);

...

/* Using the function pointer as an argument to another function */
void another_function(int (*another_pointer)(int, int))
{
    int a = 4;
    int b = 2;
    int result = (*another_pointer)(a, b);

    printf("%d
", result);
}

尽管这种语法看起来更自然且与基本类型一致,但是归因和解除引用函数指针不需要使用 &*运算符。因此,以下代码段同样有效:

/* Attribution without the & operator */
my_pointer = my_function;

/* Dereferencing without the * operator */
int result = my_pointer(4, 2);

为了提高函数指针的可读性,可以使用 typedef。

typedef void (*Callback)(int a);

void some_function(Callback callback)
{
    int a = 4;
    callback(a);
}

另一个可读性技巧是 C 标准允许人们将上述参数中的函数指针(但不是在变量声明中)简化为看起来像函数原型的东西; 因此,以下内容可以等效地用于函数定义和声明:

void some_function(void `callback(int)`)
{
    int a = 4;
    callback(a);
}

也可以看看

功能指针