函数指针 是一个指向函数的指针,可以如下定义:
int (*pfunc)(int, int);
对这条语句的解释是:
先解释(*pfunc),所以pfunc首先是一个指针;
再解释(int, int),pfunc指向一个函数,该函数的参数有两个,都是整形;
最后是返回值。
因此,如果定义了一个函数int max(int a, int b),我们就可以这样使用函数指针了:
pfunc = max; // 注意二者的返回类型,需要一致
函数指针与指针函数是不一样的,后者是一个函数,其返回值是一个指针,比如 char * index( const char *s, int c);
int (*max)(int a, int b); // 函数指针
int *max(int a, int b); // 指针函数
下面给出函数指针使用的一些代码:
(1)
int min(int a, int b)
{
return a > b ? b : a;
}
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a = 12;
int b = 34;
int (*pfunc)(int, int); // 定义一个函数指针
pfunc = min;
printf("min=%d/n", pfunc(a, b));
pfunc = max;
printf("max=%d/n", pfunc(a, b));
int (*p[2])(int, int);
p[0] = min;
p[1] = max;
printf("min=%d/n", p[0](a, b));
printf("max=%d/n", p[1](a, b));
#define abc min
printf("min=%d/n", abc(a, b));
#define efg max
printf("max=%d/n", efg(a, b));
return 0;
}
int (*p[2])(int, int)是一个函数指针数组。函数指针感觉和#define相似,见上面的代码中的#define部分。
(2)
typedef struct point
{
double x;
double y;
}Point;
int cmp1(void *a, void *b)
{
int *c = (int *)a;
int *d = (int *)b;
return *c - *d;
}
int cmp2(void *a, void *b)
{
double *c = (double *)a;
double *d = (double *)b;
double e = *c - *d;
if (e > 0)
return 1;
else if (e < 0)
return -1;
else return 0;
}
int cmp3(void *a, void *b)
{
return strcmp((char *)a, (char *)b);
}
int cmp4(void *a, void *b)
{
Point *c = (Point *)a;
Point *d = (Point *)b;
double e = c->x - d->x;
if (e > 0)
return 1;
else if (e < 0)
return -1;
else return 0;
}
void test(void *a, int n, int size, int (*p)(void *, void *))
{
void *p1 = a;
void *p2 = a + size;
// do something
printf("%d/n", p(p1, p2));
}
int main()
{
int c[2];
c[0] = 12;
c[1] = 34;
test(c, 2, sizeof(int), cmp1);
double d[2];
d[0] = 1.2;
d[1] = 3.4;
test(d, 2, sizeof(double), cmp2);
char s[2][16] = {"xiao", "she"};
test(s, 2, sizeof(s[0]), cmp3);
Point pt[2];
pt[0].x = 1.8;
pt[0].y = 1.3;
pt[1].x = 1.4;
pt[1].y = 1.5;
test(pt, 2, sizeof(Point), cmp4);
return 0;
}
例子(2)中的test函数其中一个参数是一个函数指针,分别调用不同的比较函数,以处理不同类型的数据。
和qsort是不是很相似?