一、怎样定义函数指针变量?
下面的语句,定义一个函数指针fnPtr:
int (*fnPtr) (void);
这与函数定义行相似,但有两点不同:
1 加了星号,说明是指针
2 指针名连同星号外面加了圆括号
这两点把它与函数定义行区分开来。
与函数定义行相同的是返回类型有函数参数,这两者写法一致。
二、怎样将函数指针赋给函数指针变量?
首先,函数需要先定义。
前面的例子中,如果事先定义了一个函数
lookup:
int lookup (void);
我们就可以执行下面的语句:
fnPtr = lookup;
这个语句将lookup的指针赋给fnPtr.
也可以写成
fnPtr = &lookup;
但是用不着。
三、怎样用函数指针变量调用函数?
如果函数指针变量指向了一个特定的函数,则可以用它来调用这个函数。
在上面的例子中,fnPtr已经指向了函数lookup,所以,下面的语句就调用函数lookup:
entry = fnPtr ();
也可以用:Entry = (*fnPtr) ()
两者的功能一样。
四、函数指针变量的用处
1 将函数指针变量作函数的参数。
2 将函数指针放进数组中。
下面举qsort函数的例子,它有个函数指针参数:
void qsort (arr, n, size, comp_fn)
原型:void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
使用它的示例程序:
#include <stdio.h>
#include <stdlib.h>
int comp_ints_asc (void *p1, void *p2)
{
int i1 = * (int *) p1;
int i2 = * (int *) p2;
return i1 - i2;
}
int comp_ints_des (void *p1, void *p2)
{
int i1 = * (int *) p1;
int i2 = * (int *) p2;
return i2 - i1;
}
int main (void)
{
int comp_ints (void *, void *);
int data[10]={8,7,-3,-1,9,6,8,7,3,1};
int i;
qsort (data, 10, sizeof(int), comp_ints_asc);
for (i=0;i<10;i++){
printf("%i ",data[i]);
}
printf("\n\n");
qsort (data, 10, sizeof(int), comp_ints_des);
for (i=0;i<10;i++){
printf("%i ",data[i]);
}
printf("\n");
}