1.指针函数
指针函数:本质是一个函数,返回值为指针
int *func(int a, int b, ...);
2.函数指针
函数指针:本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。
int(*func)(int a, int b, ....);
函数指针的两个典型应用
1)将函数作为参数传递给函数(此部分转自https://blog.youkuaiyun.com/yuexiang321/article/details/52658947)
相信,大家中学的时候都学过积分这个鬼东西。不知道还记不记得积分最原始的计算方法。
对,没错,无限细分,求面积。好的。我们接下来就给大家一个应用函数指针有关积分计算的例子。
#include <stdio.h>
//Calculate用于计算积分。一共三个参数。第一个为函数指针func,指向待积分函数。
二三参数为积分上下限
double Calculate(double(*func)(double x), double a, double b)
{
double dx = 0.0001;//细分的区间长度
double sum = 0;
for (double xi = a+dx; xi <= b; xi+=dx)
{
double area = func(xi)*dx;
sum +=area;
}
return sum;
}
double func_1(double x)
{
return x*x;
}
double func_2(double x)
{
return x*x*x;
}
void main()
{
printf("%lf\n", Calculate(func_1, 0, 1));
printf("%lf\n", Calculate(func_2, 0, 1));
}
这里函数指针作为函数的形参,在函数调用时,可以带入已有的同类型函数,再对函数指针进行解引用,就可以获取到函数指针指向的函数。
2)定义一种函数类型,便于定义函数,可以理解为自己定义一种类似于int 等的类型,定义一个函数就直接用类型名加函数名就可以。
typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);
//用typedef来声明函数
pCopySDMMC2Mem pf1, pf2;
//定义两个该类型的函数
3.函数指针数组
函数指针数组:本质上是数组,该数组的每一个元素都是函数指针。
(此部分转自https://blog.youkuaiyun.com/yuexiang321/article/details/52658947)
void (*funcPointerArray[3])(double x);//函数指针数组
void (*funcPointer)(double x);//函数指针
函数指针数组的实际例子:
#include <stdio.h>
void addItem(char *name)
{
printf("Add %s successfully!\n",name);
}
void deleteItem(char *name)
{
printf("Delete %s successfully!\n", name);
}
void findItem(char *name)
{
printf("Find %s successfully!\n", name);
}
void updateItem(char *name)
{
printf("Update %s successfully!\n", name);
}
void main()
{
void(*funcPointerArray[4])(char *name);
funcPointerArray[0] = addItem;
funcPointerArray[1] = deleteItem;
funcPointerArray[2] = findItem;
funcPointerArray[3] = updateItem;
printf("Please enter a number(0-3) to continue:");
int num;
scanf_s("%d", &num,1);
printf("Please enter the name of the goods:");
char buf[128];
scanf_s("%s", &buf,128);
funcPointerArray[num](buf);
}
这样可以利用函数指针数组来代替大量的switch case 语句,也就是数据驱动方式。