14.函数指针与回调函数

//函数指针
/*
	函数指针是指指向函数的指针变量,通常我们说的指针变量是指向一个字符型,整型,数组等变量,
	而函数指针是指向函数。函数指针可以向一般函数一样,用于调用函数,传递函数
*/

//一下栗子中声明了指针变量p,指向函数max
#include <stdio.h>
int max(int x, int y)
{
	return x>y?x:y;
}
int main01()
{
	//p是函数指针
	int (*p)(int, int) = &max;
	int a,b,c,d;
	printf("请输入三个数字:");
	scanf("%d %d %d",&a,&b,&c);
	//与直接调用函数等价
	d = max(max(a,b),c);
	printf("max=%d\n", d);
	/*
	请输入三个数字:11 33 22
	max=33
	*/
}
//回调函数
/*
	函数指针作为某个函数的参数
	函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
	简单讲:回调函数是由别人的函数执行时调用你实现的函数。
	以下是自知乎作者常溪玲的解说:
	你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话.
	过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货
	在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,
	店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
*/
//举个栗子
/*
	实例中 populate_array 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。
	实例中我们定义了回调函数 getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给 populate_array 函数。
	populate_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。
*/
//回调函数
#include <stdio.h>
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();
}
int main()
{
	int myarray[10];
	populate_array(myarray, 10, getNextRandomValue);
	for (int i=0;i<10;i++)
	{
		printf("%d\n",myarray[i]);
	}
	/*
	41
	18467
	6334
	26500
	19169
	15724
	11478
	29358
	26962
	24464
	*/
}
//分析一下代码的逻辑
/*
	首先传入了myarray,而在populate_array中接收的是指针,说明可以在populate_array中的修改,
	会影响到我们在main函数中的打印,我们传入size无需介绍,然后最后一个参数是函数的指针,
	我们在直接调用指向函数的指针的时候,会自动找到指针指向的函数,从而获取rand()随机值,赋给arr[i]
	从而在main()中打印
*/
//关于传递函数指针,如何传递,我们定义了int arr(int a, int b),
//那么传递指针的时候要保持返回值类型和参数类型一致即可,名字随意,然后在函数名前加上*表示接收的是指针类型即可

//笔记
/*
	有关于size_t,size_t是一种数据类型,近似于无符号整型,但是容量范围一般大于int和unsigned。
	这里使用size_t是为了保证arraySize有足够大的容量来储存可能大的数组
*/

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/9484721.html