函数指针
指针也可用于指向功能。
我们来看一个基本功能:
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);
}