• 函数指针、函数指针数组、计算器+转移表等归纳总结


    本部分内容属于C语言的高级玩法,属实厉害


    🚀目录:

    本部分内容属于C语言的高级玩法,属实厉害

    1.函数指针:指向函数的指针变量

    2.函数指针数组:存放函数指针的数组

    3.计算器 / 转移表


    🔥🔥函数指针:指向函数的指针变量

    🚵我们知道,数组名就是数组的首元素的地址,这样数组和指针就有了联系

    那么,函数名也可以得到地址吗?

    答案是:可以的,函数名得到的是函数的地址。

    下面这俩种方式均可以取出函数的地址

    &函数名

    函数名

    🚵书写格式

    数组指针的书写格式是这样的

    int arr[5]={0};

    int (*p)[5]=&arr;

    函数指针和数组指针类似;

    int (*pf)(int,int)=&Add;

    int ret=(*pf)(2,3);

    或int ret=pf(2,3);

    注意:有 * 就一定要有( )

    🚵来看一个函数指针的简单代码,

    1. #include <stdio.h>
    2. int Add(int x, int y)
    3. {
    4. return x + y;
    5. }
    6. void calc(int (*pf)(int, int))
    7. {
    8. int x = 0;
    9. int y = 0;
    10. scanf("%d %d", &x, &y);
    11. int ret = (*pf)(x, y);
    12. printf("%d\n", ret);
    13. }
    14. int main()
    15. {
    16. calc(Add);
    17. return 0;
    18. }

    具体剖析一下


    🔥🔥函数指针数组:存放函数指针的数组

    int (*arr[4])(int,int)={Add,Sub,Mul,Div};

    int (*parr1[10])( );

    用法尽在转移表中


    🔥🔥🔥计算器 / 转移表

    举例:写个计算器

    这里介绍三种写法:普通方法、函数指针方法、函数指针数组方法

    ①普通的写法:

    👇👇

    1. #include <stdio.h>
    2. void menu()
    3. {
    4. printf("***************************\n");
    5. printf("***************************\n");
    6. printf("****** 0.leave ******\n");
    7. printf("****** 1.Add ******\n");
    8. printf("****** 2.Sub ******\n");
    9. printf("****** 3.Mul ******\n");
    10. printf("****** 4.Div ******\n");
    11. printf("***************************\n");
    12. printf("***************************\n");
    13. }
    14. int Add(int x, int y)
    15. {
    16. return x + y;
    17. }
    18. int Sub(int x, int y)
    19. {
    20. return x - y;
    21. }
    22. int Mul(int x, int y)
    23. {
    24. return x * y;
    25. }
    26. int Div(int x, int y)
    27. {
    28. return x / y;
    29. }
    30. int main()
    31. {
    32. int input = 0;
    33. int a = 0;
    34. int b = 0;
    35. int c = 0;
    36. do
    37. {
    38. menu();
    39. printf("请选择:");
    40. scanf("%d", &input);
    41. switch (input)
    42. {
    43. case 0:
    44. printf("退出\n");
    45. break;
    46. case 1:
    47. printf("请输入俩个操作数:");
    48. scanf("%d %d", &a, &b);
    49. c = Add(a, b);
    50. printf("%d\n", c);
    51. break;
    52. case 2:
    53. printf("请输入俩个操作数:");
    54. scanf("%d %d", &a, &b);
    55. c = Sub(a, b);
    56. printf("%d\n", c);
    57. break;
    58. case 3:
    59. printf("请输入俩个操作数:");
    60. scanf("%d %d", &a, &b);
    61. c = Mul(a, b);
    62. printf("%d\n", c);
    63. break;
    64. case 4:
    65. printf("请输入俩个操作数:");
    66. scanf("%d %d", &a, &b);
    67. c = Div(a, b);
    68. printf("%d\n", c);
    69. break;
    70. default:
    71. printf("输入错误,重新输入\n");
    72. }
    73. } while (input);
    74. return 0;
    75. }

    ②用函数指针的写法:

    👇👇

    1. #include <stdio.h>
    2. void menu()
    3. {
    4. printf("***************************\n");
    5. printf("***************************\n");
    6. printf("****** 0.leave ******\n");
    7. printf("****** 1.Add ******\n");
    8. printf("****** 2.Sub ******\n");
    9. printf("****** 3.Mul ******\n");
    10. printf("****** 4.Div ******\n");
    11. printf("***************************\n");
    12. printf("***************************\n");
    13. }
    14. int Add(int x, int y)
    15. {
    16. return x + y;
    17. }
    18. int Sub(int x, int y)
    19. {
    20. return x - y;
    21. }
    22. int Mul(int x, int y)
    23. {
    24. return x * y;
    25. }
    26. int Div(int x, int y)
    27. {
    28. return x / y;
    29. }
    30. void calc(int (*pf)(int, int))
    31. {
    32. int a = 0;
    33. int b = 0;
    34. int c = 0;
    35. printf("请输入俩个操作数:");
    36. scanf("%d %d", &a, &b);
    37. c = (*pf)(a, b);
    38. //c=pf(a,b);这种格式也可以
    39. printf("%d\n", c);
    40. }
    41. int main()
    42. {
    43. int input = 0;
    44. do
    45. {
    46. menu();
    47. printf("请选择:");
    48. scanf("%d", &input);
    49. switch (input)
    50. {
    51. case 0:
    52. printf("退出\n");
    53. break;
    54. case 1:
    55. calc(Add);
    56. break;
    57. case 2:
    58. calc(Sub);
    59. break;
    60. case 3:
    61. calc(Mul);
    62. break;
    63. case 4:
    64. calc(Div);
    65. break;
    66. default:
    67. printf("输入错误,重新输入\n");
    68. }
    69. } while (input);
    70. return 0;
    71. }

    🚵在这里我们来比较普通写法和函数指针写法:

    🚵 通过上图,就可以发现普通写法实属冗余,函数指针的方法简化了很多。

    但是函数指针需要写一个函数来接收函数的地址,如下:

    ③用函数指针数组的写法,又称转移表

    👇👇

    1. #include <stdio.h>
    2. void menu()
    3. {
    4. printf("***************************\n");
    5. printf("***************************\n");
    6. printf("****** 0.leave ******\n");
    7. printf("****** 1.Add ******\n");
    8. printf("****** 2.Sub ******\n");
    9. printf("****** 3.Mul ******\n");
    10. printf("****** 4.Div ******\n");
    11. printf("***************************\n");
    12. printf("***************************\n");
    13. }
    14. int Add(int x, int y)
    15. {
    16. return x + y;
    17. }
    18. int Sub(int x, int y)
    19. {
    20. return x - y;
    21. }
    22. int Mul(int x, int y)
    23. {
    24. return x * y;
    25. }
    26. int Div(int x, int y)
    27. {
    28. return x / y;
    29. }
    30. int main()
    31. {
    32. int input = 0;
    33. int a = 0;
    34. int b = 0;
    35. int c = 0;
    36. do
    37. {
    38. menu();
    39. printf("请选择:");
    40. scanf("%d", &input);
    41. if (input == 0)
    42. printf("退出\n");
    43. else if (input >= 1 && input <= 4)
    44. {
    45. int (*p[5])(int x, int y) = { 0,Add,Sub,Mul,Div };
    46. printf("请输入俩个操作数:");
    47. scanf("%d %d", &a, &b);
    48. c = p[input](a, b);
    49. //c = (*p[input])(a, b);这种格式也可以
    50. printf("%d\n", c);
    51. }
    52. else
    53. printf("输入错误,重新输入\n");
    54. } while (input);
    55. return 0;
    56. }

    🚵这里我们来比较一下函数指针和函数指针数组:

    这俩种方法并没有优劣,只是提供了不同的做题角度

    具体剖析函数指针数组:

    将Add、Sub、Mul、Div 函数的地址存放在函数指针数组里,用户输入input,再通过(*p[input])找到正确的函数地址


    🚀结语:

    如果对您有帮助的话,

    不要忘记点赞+关注哦,蟹蟹

    如果对您有帮助的话,

    不要忘记点赞+关注哦,蟹蟹

    如果对您有帮助的话,

    不要忘记点赞+关注哦,蟹蟹

  • 相关阅读:
    品牌夜间低价数据如何监测
    SAP:BAPI修改销售订单交货注释
    【Linux】部署单体项目以及前后端分离项目(项目部署)
    Git禁止松散对象loose objects弹窗
    抽奖小程序源码:多功能萝卜抽奖系统微信小程序抽奖功能源码【更新】
    股票程序交易接口的测试流程
    20_数组的常见操作
    # Oracle 库常见问题排查
    【网络安全】XSS跨站脚本攻击专题讲解
    苏东坡在元丰五年
  • 原文地址:https://blog.csdn.net/qq_68993495/article/details/125466773