函数指针和回调函数
函数指针作为某个函数的参数
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
简单讲:回调函数是由别人的函数执行时调用你实现的函数。
以下是自知乎作者常溪玲的解说:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
实例中 populate_array 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。
实例中我们定义了回调函数 getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给 populate_array 函数。
populate_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。
#include <stdio.h> #include <stdlib.h> #include <time.h> /* 回调函数: 第一个参数:数组指针 第二个参数:数组长度 第三个参数:函数指针 */ void callBackFunction(int *array, size_t arraySize, int (*getNextValue)(void)) { srand((unsigned)time(NULL)); // 设置随机数种子 for(size_t i=0; i<arraySize; i++) { array[ i ] = getNextValue(); } } // 产生随机数 int getNextRandomValue() { return rand(); } int main() { int myArray[ 5 ]; // 调用回调函数 callBackFunction(myArray, 5, getNextRandomValue); for(int i=0; i<5; i++) { printf("%d \t", myArray[ i ]); } printf("\n"); // 结束main函数 return 0; }
size_t 是一种数据类型,近似于无符号整型,但容量范围一般大于 int 和 unsigned。这里使用 size_t 是为了保证 arraysize
变量能够有足够大的容量来储存可能大的数组。size_t 在stddef.h头文件中定义。