函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数
//函数指针
Type (*函数指针名)(T1 t1, T2 t2, ..., Tn tn); //未初始化形式的函数指针定义,不推荐
Type (*函数指针名)(T1 t1, T2 t2, ..., Tn tn) = FuncCodeAddr //FuncCodeAddr:代码区空间地址
/*一般是函数名或同类型函数指针中保存的地址值*/
double (*p)(int, char *) = NULL;
double (*p)(int, char *) = &func; //&可以不写(只有函数指针可以不写&)
double (*p)(int, char *) = func; //项目多数采用这种写法
func(10, str); //
*p(10, str); //间接调用指向函数, *可以不写(只有函数指针可以不写*)
p(10, str); //项目多数采用这种写法
函数指针一般用在两个方面
1、做结构体变量的函数指针
2、做函数形参
下面是用函数指针来做形参来模仿c库里的排序函数Qsort()
//函数指针(函数形参)
/*double sort*/
int CompareDouble(const void *p1, const void *p2)
{
double t = (*(double *)p1 - *(double *)p2);
if(t > 0) return 1;
else if(t == 0) return 0;
else return -1;
}
int SortDouble(void)
{
int i = 0;
double array[4] = {9.9, 2.4, 5.4, 5.6};
// qsort(array, 4, sizeof(double), CompareDouble);
SimulateQsort(array, 4, sizeof(double), CompareDouble);
for(i=0; i<4; i++)
{
printf("%lf\t", array[i]);
}
return 0;
}
/*Simulate Qsort*/
int SimulateQsort(void *p, int num, int size, int (*cmp)(const void *, const void *) )
{
int i = 0;
int j = 0;
void *ptemp = malloc(size);
if(p == NULL || num <= 0 || size <= 0 || cmp == NULL || ptemp == NULL)
{
return -1;
}
memset(ptemp, 0, size);
for(i=0; i<num; i++)
{
for(j=0; j<num-i-1; j++)
{
if(cmp( (char *)p+j*size, (char *)p+(j+1)*size ) > 0 ) //p 大于 p+size 则交换
{
memcpy(ptemp, (char *)p+(j+1)*size, size);
memcpy((char *)p+(j+1)*size, (char *)p+j*size, size);
memcpy((char *)p+j*size, ptemp, size);
}
}
}
return 0;
}