C语⾔之typedef函数指针⽤法
C语⾔之typedef函数指针⽤法
1.简单的函数指针的应⽤
形式1:返回类型(*函数名)(参数表)
[cpp]
1. char (*pFun)(int);
2. char glFun(int a){ return;}
3. void main()
4. {
5.    pFun = glFun;
6.    (*pFun)(2);
7. }
第⼀⾏定义了⼀个指针变量pFun。⾸先我们根据前⾯提到的“形式1”认识到它是⼀个指向某种函数的指针,这种函数参数是⼀个int型,返回值是char类型。只有第⼀句我们还⽆法使⽤这个指针,因为我们还未对它进⾏赋值。
第⼆⾏定义了⼀个函数glFun()。该函数正好是⼀个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是⼀个指针,函数名指向该函数的代码在内存中的⾸地址
指针函数的作用然后就是main()函数了,它的第⼀句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第⼆句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。
2.使⽤typedef更直观更⽅便
形式1:typedef  返回类型(*新类型)(参数表)
[cpp]
1. typedef char (*PTRFUN)(int);
2. PTRFUN pFun;
3. char glFun(int a){ return;}
4. void main()
5. {
6.    pFun = glFun;
7.    (*pFun)(2);
8. }
typedef的功能是定义新的类型。第⼀句就是定义了⼀种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以⼀个int为参数并返回char类型。后⾯就可以像使⽤int,char⼀样使⽤PTRFUN了。
第⼆⾏的代码便使⽤这个新类型定义了变量pFun,此时就可以像使⽤形式1⼀样使⽤这个变量了。
3.例⼦说明
[cpp]
1. #include <stdio.h>
2. #include <assert.h>
3.
4. typedef int (*FP_CALC)(int,int);//定义⼀个函数指针类型
4. typedef int (*FP_CALC)(int,int);//定义⼀个函数指针类型
5.
6. int add(int a, int b)
7. {
8.    return a + b;
9. }
10.
11. int sub(int a, int b)
12. {
13.    return a - b;
14. }
15.
16. int mul(int a, int b)
17. {
18.    return a * b;
19. }
20.
21. int div(int a, int b)
22. {
23.    return b ? a/b : -1;
24. }
25.
26. //定义⼀个函数,参数为op,返回⼀个指针,该指针类型为拥有两个int参数、
27. //返回类型为int的函数指针。它的作⽤是根据操作符返回相应函数的地址
28. FP_CALC calc_func(char op)
29. {
30.    switch( op )
31.    {
32.    case '+':
33.        return add;
34.    case '-':
35.        return sub;
36.    case '*':
37.        return mul;
38.    case '/':
39.        return div;
40.    default:
41.        return NULL;
42.    }
43.    return NULL;
44. }
45.
46. //s_calc_func为函数,它的参数是 op,
47. //返回值为⼀个拥有两个int参数、返回类型为int的函数指针
47. //返回值为⼀个拥有两个int参数、返回类型为int的函数指针
48. int (*s_calc_func(char op)) (int , int)
49. {
50.    return calc_func(op);
51. }
52.
53. //最终⽤户直接调⽤的函数,该函数接收两个int整数,
54. //和⼀个算术运算符,返回两数的运算结果
55. int calc(int a, int b, char op)
56. {
57.    FP_CALC fp = calc_func(op);
58.    int (*s_fp)(int,int) = s_calc_func(op);//⽤于测试
59.
60.    assert(fp == s_fp);// 可以断⾔这两个是相等的
61.
62.    if(fp)
63.        return fp(a,b);
64.    else
65.        return -1;
66. }
67.
68. void main()
69. {
70.    int a = 100, b = 20;
71.
72.    printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
73.    printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
74.    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
75.    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
76. }
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。