• 知识联合——函数指针数组


    前言:小伙伴们又见面啦,今天我们来讲解一个将函数,指针,数组这三个C语言大将整合在一起的知识——函数指针数组。同时来告诉小伙伴们我们上一篇文章的伏笔——函数指针的具体用法


    目录

    一.什么是函数指针数组

    二.函数指针数组的形式

    三.函数指针数组的使用

    四.总结


    一.什么是函数指针数组

    我们前边已经学习过了函数指针,也学习过指针数组,那么什么是函数指针数组呢???

    这里要告诉大家,只要哪个名词在最后,就说明它的本质是这个名词,所以函数指针数组的本质,就是一个数组。而这个数组存放的是什么东西呢——函数指针

    二.函数指针数组的形式

    OK,那么已经知道了函数指针数组是什么东西之后,我们来思考一下怎么来表示它。

    这个其实简单,它是一个数组,是一个存放函数指针类型的数组,我们参考之前讲过的函数指针和指针数组的表示方法,得出函数指针数组的形式为:

    void (* arr[])(void ,void) = { };

     arr[]代表它是数组把arr[]去掉,剩下的void (*)(void , void)则表示其存放的类型为函数指针

    三.函数指针数组的使用

    OK,现在我们已经清楚了函数指针数组的形式,那么该怎么具体使用它呢???

    假设我们现在要写一个代码模拟实现计算器的加、减、乘、除

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

    我们将四则运算写成函数形式,并通过do-while循环和switch-case语句来实现计算器的加、减、乘、除功能。

    但是我们能看出,这样的写法是不是太过于繁琐,很多语句都重复使用了很多次。

    我们已经把四则运算写成了函数,而且我们也知道怎么用指针调用函数,那么我们现在是不是可以考虑:将这些函数全放在一个数组中,在通过数组去调用是不是更加的简洁方便呢???

    下面我们就用函数指针数组来实现一下:

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

    来看用函数指针数组来实现。

    我们将四个函数的地址都通过函数指针来保存在数组中,但是我们知道,数组的下标是从0开始的,那么我们希望选择的数字和计算器选择数达成一致,便在数组下标为0的位置放一个NULL空指针。这时候我们的输入数input就可以帮助我们从数组中调用对应的函数来实现运算。

    这样的代码是不是比上边的简单整洁多了。

    当我们想要同时管理多个函数时,便可以使用函数指针数组,这便是函数指针数组的实际用法。

    四.总结

    函数指针数组有关的知识和用法的讲解到这里就结束啦。其实这部分内容还是很好理解哒。

    最后不要忘记一键三连呀!

    我们下期再见!

  • 相关阅读:
    WPF篇(8)- Button按钮
    找出字符串中第一个匹配项的下标
    NLP Bi-Encoder和Re-ranker
    微信小程序中使用字体库_小程序使用自定义字体库
    顺丰同城前端一面
    一站式开源持续测试平台 MerterSphere 之测试跟踪操作详解
    好用免费的PPT模板
    《永劫无间》找不到ffmpeg.dll无法继续执行怎么办,永劫无间找不到ffmpeg.dll解决方案
    【Linux】提升yum下载速度
    破解WIFI密码之密码字典
  • 原文地址:https://blog.csdn.net/2303_78442132/article/details/132967714