函数指针和函数指针数组及其应用
先来看一个简单的例子:
int a=3; void *p=&a;这是一个基础的不能再基础的例子。相信学过指针的都能看得懂。P是一个指针,指向a。a 是一个整形变量。函数指针和其类似,只不过其指向的不是一个变量,而是一个函数,仅此而已。话不多说,看个例子。
void (*funcPointer)(double x); void f1(double x){} void f2(double x){} funcPointer=f1; funcPointer=&f2;好了。简单的5行代码就完成了一个简单的函数指针。我们一行行来看。第一行。声明了一个函数指针。其和普通指针有啥区别。我放在一起让大家看一下。
void (*funcPointer)(double x);//函数指针 void *pointer;//普通指针看出来了么。函数指针无非多了两个括号和一个参数列表。想想也是。函数指针如果没有参数列表那还玩个啥。所以肯定需要参数。那多那俩括号干嘛?好,那大家看一下这个例子。
void *funcPointer(double x);长得是不是和函数指针贼像。其实也就是像而已,他们是两个东西。这个只是声明了一个普通的函数(我把它起名叫funcPointer,只是想对比一下),它的返回值是一个void类型的指针而已。有些地方也把它叫做指针函数(就是返回值为指针的函数)好了声明说完了,我们接下来往下看。第二三行没啥说的,声明俩函数而已。那么我么来看看四五行。函数指针既然是个指针,我们肯定要让它指东西啊。那么这两行就是让它指向具体的函数。这两种写法都是OK的。都可以被编译器接受。(以前只有第一种被认可,现在两种都可以了)
好了,说了这么多。总结一下。函数指针就是指向函数体第一行可执行语句的一个指针。至于他有什么作用呢。这里给大家提供一个具体的应用的例子。相信,大家中学的时候都学过积分这个鬼东西。不知道还记不记得积分最原始的计算方法。对,没错,无限细分,求面积。好的。我们接下来就给大家一个应用函数指针有关积分计算的例子。直接贴出代码。
#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. 函数指针数组函数指针说完了。我们接下来来看看函数指针数组。多了俩字。数组。前面四个字还一样。那是不是就是有一个数组,用它来盛放函数指针。嗯,没错,就是这样。有了刚才的基础,我直接给出例子。
void (*funcPointerArray[3])(double x);//函数指针数组 void (*funcPointer)(double x);//函数指针两个放在一起对比,函数指针数组无非就像数组声明一样,在后面加了[]而已。仅此而已。那它怎么用呢?
void f2(double x){} void f3(double x){} //来三个具体的函数,f1,f2,f3. void (*funcPointerArray[3])(double x); funcPointerArray[0]=f1; funcPointerArray[1]=f2; funcPointerArray[2]=f3; funcPointerArray[0](“2.333333”); funcPointerArray[1](“6.666666”);简直就和普通的数组一模一样。没错,无非他存储的是函数指针而已。
最后,贴一个用函数指针数组的具体的应用的例子。
#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 直接通过传入的num值来调用不同的函数。好了,相信讲到这里,大家应该清楚的明白什么是函数指针和函数指针数组了。总结
以上是生活随笔为你收集整理的函数指针和函数指针数组及其应用的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: FATFS文件系统框架及源码分析
- 下一篇: QQ采用什么传输协议?