【实战篇】函数指针与指针函数的应用
ID:技术让梦想更伟大
整理:李肖遥
// 通过函数指针调用函数范例程序
1 #include<stdio.h>
2 int add(int a, int b)
3 {
4 printf("addition function\n");
5 return a + b;
6 }
7
8 int sub(int a, int b)
9 {
10 printf("subtration function\n");
11 return a - b;
12 }
13
14 int main(void)
15 {
16 int (*pf)(int, int);
17
18 pf = add;
19 printf("addition result:%d\n", pf(5, 8));
20 pf = sub;
21 printf("subtration result:%d\n", pf(8, 5));
22 return 0;
23 }
//求最大值函数(指针作为函数的返回值)
1 #include<stdio.h>
2 int *max(int *p1, int *p2)
3 {
4 if(*p1 > *p2)
5 return p1;
6 else
7 return p2;
8 }
9
10 int main(int argc, char *argv[])
11 {
12 int *p, a, b;
13 a = 1; b = 2;
14 p = max(&a, &b);
15 printf("%d\n", *p);
16 return 0;
17 }
typedef int (*PF)(int, int);
有了这个类型,那么上述函数的声明就变得简单多了。即:
PF ff(int);
下面将以程序清单 2.3为例,说明用函数指针作为函数返回值的用法。当用户分别输入d、x和p时,求数组的最大值、最小值和平均值。
//求最值与平均值范例程序
1 #include<stdio.h>
2 #include <assert.h>
3 double getMin(double *dbData, int iSize) // 求最小值
4 {
5 double dbMin;
6
7 assert((dbData != NULL) && (iSize > 0));
8 dbMin = dbData[0];
9 for (int i = 1; i < iSize; i++){
10 if (dbMin > dbData[i]){
11 dbMin = dbData[i];
12 }
13 }
14 return dbMin;
15 }
16
17 double getMax(double *dbData, int iSize) // 求最大值
18 {
19 double dbMax;
20
21 assert((dbData != NULL) && (iSize > 0));
22 dbMax = dbData[0];
23 for (int i = 1; i < iSize; i++){
24 if (dbMax < dbData[i]){
25 dbMax = dbData[i];
26 }
27 }
28 return dbMax;
29 }
30
31 double getAverage(double *dbData, int iSize) // 求平均值
32 {
33 double dbSum = 0;
34
35 assert((dbData != NULL) && (iSize > 0));
36 for (int i = 0; i < iSize; i++){
37 dbSum += dbData[i];
38 }
39 return dbSum/iSize;
40 }
41
42 double unKnown(double *dbData, int iSize) // 未知算法
43 {
44 return 0;
45 }
46
47 typede double (*PF)(double *dbData, int iSize); // 定义函数指针类型
48 PF getOperation(char c) // 根据字符得到操作类型,返回函数指针
49 {
50 switch (c){
51 case 'd':
52 return getMax;
53 case 'x':
54 return getMin;
55 case 'p':
56 return getAverage;
57 default:
58 return unKnown;
59 }
60 }
61
62 int main(void)
63 {
64 double dbData[] = {3.1415926, 1.4142, -0.5, 999, -313, 365};
65 int iSize = sizeof(dbData) / sizeof(dbData[0]);
66 char c;
67
68 printf("Please input the Operation :\n");
69 c = getchar();
70 PF pf = getOperation(c);
71 printf("result is %lf\n", pf(dbData, iSize));
72 return 0;
73 }
前4个函数分别实现了求最大值、最小值、平均值和未知算法,getOperation()
根据输入字符得到的返回值是以函数指针的形式返回的,从pf(dbData, iSize)
可以看出是通过这个指针调用函数的。注意,指针函数可以返回新的内存地址、全局变量的地址和静态变量的地址,但不能返回局部变量的地址,因为函数结束后,在函数内部的声明的局部变量的声明周期已经结束,内存将自动放弃。显然,在主调函数中访问这个指针所指向的数据,将会产生不可预料的结果。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
扫描下方微信,加作者微信进技术交流群,请先自我介绍喔。
推荐阅读:
嵌入式编程专辑 Linux 学习专辑 C/C++编程专辑 Qt进阶学习专辑 关注微信公众号『技术让梦想更伟大』,后台回复“m”查看更多内容。 长按前往图中包含的公众号关注
评论