c语言的函数指针与回调函数

c语言的函数指针与回调函数

函数指针

定义了一个函数类型的指针变量。

通常我们说的指针变量是指一个整型、字符型或数组等变量,而函数指针是指向函数。

函数指针可以想一般函数一样,用于调用函数、传递参数。

函数指针类型的声明:

typedef int (*fun_ptr)(int,int);//声明一个指向同样参数、返回值的函数指针类型

实例:

声明指针p,指向函数max

#include <stdio.h>

int max(int x, int y)
{
    return x>y?x:y;
}

int main()
{
    int (*p)(int,int) = &max;//&可以省略
    int a,b,c,d;
    
    printf("请输入三个数字:\n");
    scanf("%d %d %d",&a,&b,&c);
    d = p(p(a,b),c);
    
    printf("最大的数字是:%d\n",d);
    
    return 0;
}

编译执行结果为:

请输入三个数字:
1 2 3
最大的数字是:3

回调函数

函数指针可以作为某个函数的参数来使用,回调函数就是一个通过函数指针调用的函数。

回调函数是由别人的函数执行时调用你实现的函数。

实例:

实例中定义populate_array()函数,定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。

实例中我们定义额回调函数getNextRandomValue(),它返回一个随机值,它作为函数指针传递给populate_array()函数。

populate_array()将调用10次的回调函数,并将回调函数的返回值赋值给数组。

#include <stdio.h>
#include <stdlib.h>


void populate_array(int *array,size_t arraySize,int (*getNextValue)())
{
	
	for(size_t i = 0; i < arraySize; i++){
		array[i] = getNextValue();
	}
	
}

int getNextRandomValue()
{
	
	return rand();
}

int main()
{
    int myArray[10];
	
	/* getNextRandomValue 不能加括号,否则无法编译,
	因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/
	populate_array(myArray, 10, getNextRandomValue);
	
	for(size_t i = 0; i < 10; i++){
		 printf("%d ", myArray[i]);
    }
    return 0;
}

编译执行结果:

41 18467 6334 26500 19169 15724 11478 29358 26962 24464
posted @ 2025-04-26 21:16  站着说话不腰疼  阅读(57)  评论(0)    收藏  举报