回调函数1:不在程序中显示调用,通过其他函数调用的函数
int compare(void* x,void* y,int(*p)()){ return p(x,y)}
compare(a,b,&cmp_str) ------1
compare(a,b,&cmp_str(a,b)) -------2
1,2它们是等价的
char compare_str(void* x,void* y)
#include<stdio.h>
#include<string.h>
int compare_str(char* x,char* y)
{
return stccmp(x,y);
}
int compare_int(int* x,int* y)
{
return (x<y?x:y);
}
int compare(void* x,void* y,int(*p)()) // 在此处,x , y 为 int(*P)() 是要使用的参数
{ // 本程序中 int (*p)() 指向 int compare(int ,int);
return p(x,y); // 说明了函数指针可以忽略参数
}
inrt main(void)
{
char a[2] = "a";
char b[2] = "b";
int ret1 = compare(a,b,&cmp_str);
int x = 9;
int y = 10
int ret2 = compare(x,y,&cmp_int);
return 0;
}
回调函数2:
void *(*star_routine)(void*) === 指向了一个第三方函数,是一个函数指针。
(*star_routine) === 指表示此处应该传入函数指针
void * (void*) ==== 只是对 *star_routine 的描述
void * func (void*)
仔细观察,实际上与上面中compare 函数的 int (*p) ()是一样的。
int === void* 返回值是一个指针 , () ====(void*) 函数参数表 ,其中void*可省略。
实际上,函数指针当参数,用使用时我们要传的只是要调用的函数的地址。
回调函数3
void (*signal (int sig,void (*func) (int)))(int);
涉及了一个函数指针的隐式调用 , 程序中(ˇˍˇ) 想调用func这个函数指针,但通过signal调用。
void (*func)(int) 是一个函数指针,在这也是一个参数。
令void(*func)(int) ==== a, 则 signal(int sig ,a) 是个函数,再加上* 表示指针。
即:*signal(int sig,a) 类似于函数指针int (*p)()中的 (*p)
void (*signal(int sig,void(*func)(int))(int) === void (*signal(int sig,a)) (int); 这也是一个函数指针,指向函数指针的函数指针。
===> void (*p) ()