二、回调函数
作者:解琛
时间:2020 年 9 月 11 日
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
populate_array 函数定义了 3 个参数,其中第 3 个参数是函数的指针,通过该函数来设置数组的值。
populate_array(myarray, 10, getNextRandomValue);
getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针。
我们定义了回调函数 getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给 populate_array 函数。
#include <stdlib.h>
int getNextRandomValue(void)
{
return rand();
}
populate_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
for (size_t i=0; i<arraySize; i++)
array[i] = getNextValue();
}
完整的代码如下。
#include <stdlib.h>
#include <stdio.h>
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void));
int getNextRandomValue(void);
int main(void)
{
int myarray[10];
populate_array(myarray, 10, getNextRandomValue);
for(int i = 0; i < 10; i++) {
printf("%d: %d\n", i, myarray[i]);
}
return 0;
}
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
for (size_t i = 0; i < arraySize; i++)
array[i] = getNextValue();
}
int getNextRandomValue(void)
{
return rand();
}
执行结果如下。
xiechen@xiechen-Ubuntu:~/6.本地实验中心/3.c$ gcc 1.回调函数.c
xiechen@xiechen-Ubuntu:~/6.本地实验中心/3.c$ ./a.out
0: 1804289383
1: 846930886
2: 1681692777
3: 1714636915
4: 1957747793
5: 424238335
6: 719885386
7: 1649760492
8: 596516649
9: 1189641421