• 指针学习(五)


    一.函数指针数组

    定义:函数指针放进数组中,就叫函数指针数组,准确的说,将一个函数的地址存到⼀个数组中

    那这个数组就叫函数指针数组。
    int (*pi[5])(int);

    解读:pi先和[]结合,因此是数组,加int (*   )(int)表示其是函数指针

    重在理解!!!

    例一:

    实现计算器(转移表)

    法一:(不用函数指针数组)

    实现:加,减,乘,除,取余,左移,右移

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. void Menu()
    5. {
    6. printf("***************************\n");
    7. printf("***** 0.quit ********\n");
    8. printf("***** 1.Add ********\n");
    9. printf("***** 2.Sub ********\n");
    10. printf("***** 3.Mul ********\n");
    11. printf("***** 4.Div ********\n");
    12. printf("***** 5.Mod ********\n");
    13. printf("***** 6.Lsh ********\n");
    14. printf("***** 7.Rsh ********\n");
    15. printf("***************************\n");
    16. }
    17. int Add(int x, int y)
    18. {
    19. return x + y;
    20. }
    21. int Sub(int x, int y)
    22. {
    23. return x - y;
    24. }
    25. int Mul(int x, int y)
    26. {
    27. return x * y;
    28. }
    29. int Div(int x, int y)
    30. {
    31. return x / y;
    32. }
    33. int Mod(int x, int y)
    34. {
    35. return x % y;
    36. }
    37. int Lsh(int x, int y)
    38. {
    39. return x << y;
    40. }
    41. int Rsh(int x, int y)
    42. {
    43. return x >> y;
    44. }
    45. int main()
    46. {
    47. Menu();
    48. int x = 0;
    49. int y = 0;
    50. int input = 0;
    51. printf("请输入:\n");
    52. scanf("%d", &input);
    53. int ret = 0;
    54. do
    55. {
    56. switch (input)
    57. {
    58. case 0:
    59. {
    60. printf("退出,欢迎下次使用\n");
    61. break;
    62. }
    63. case 1:
    64. {
    65. printf("请输入:\n");
    66. scanf("%d %d", &x, &y);
    67. printf("%d\n", Add(x, y));
    68. break;
    69. }
    70. case 2:
    71. {
    72. printf("请输入:\n");
    73. scanf("%d %d", &x, &y);
    74. printf("%d\n", Sub(x, y));
    75. break;
    76. }
    77. case 3:
    78. {
    79. printf("请输入:\n");
    80. scanf("%d %d", &x, &y);
    81. printf("%d\n", Mul(x, y));
    82. break;
    83. }
    84. case 4:
    85. {
    86. printf("请输入:\n");
    87. scanf("%d %d", &x, &y);
    88. printf("%d\n", Div(x, y));
    89. break;
    90. }
    91. case 5:
    92. {
    93. printf("请输入:\n");
    94. scanf("%d %d", &x, &y);
    95. printf("%d\n", Mod(x, y));
    96. break;
    97. }
    98. case 6:
    99. {
    100. printf("请输入:\n");
    101. scanf("%d %d", &x, &y);
    102. printf("%d\n", Lsh(x, y));
    103. break;
    104. }
    105. case 7:
    106. {
    107. printf("请输入:\n");
    108. scanf("%d %d", &x, &y);
    109. printf("%d\n", Rsh(x, y));
    110. break;
    111. }
    112. }
    113. } while (input);
    114. return 0;
    115. }

    法二:(利用函数指针数组)

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. void Menu()
    5. {
    6. printf("***************************\n");
    7. printf("***** 0.quit ********\n");
    8. printf("***** 1.Add ********\n");
    9. printf("***** 2.Sub ********\n");
    10. printf("***** 3.Mul ********\n");
    11. printf("***** 4.Div ********\n");
    12. printf("***** 5.Mod ********\n");
    13. printf("***** 6.Lsh ********\n");
    14. printf("***** 7.Rsh ********\n");
    15. printf("***************************\n");
    16. }
    17. int Add(int x, int y)
    18. {
    19. return x + y;
    20. }
    21. int Sub(int x, int y)
    22. {
    23. return x - y;
    24. }
    25. int Mul(int x, int y)
    26. {
    27. return x * y;
    28. }
    29. int Div(int x, int y)
    30. {
    31. return x / y;
    32. }
    33. int Mod(int x, int y)
    34. {
    35. return x % y;
    36. }
    37. int Lsh(int x, int y)
    38. {
    39. return x << y;
    40. }
    41. int Rsh(int x, int y)
    42. {
    43. return x >> y;
    44. }
    45. int main()
    46. {
    47. Menu();
    48. int x = 0;
    49. int y = 0;
    50. int input = 0;
    51. int (*pi[8])(int x, int y) = { 0,Add ,Sub,Mul,Div,Mod,Lsh,Rsh};
    52. printf("请输入:\n");
    53. scanf("%d", &input);
    54. int ret = 0;
    55. if (0 == input)
    56. {
    57. printf("退出,欢迎下次使用\n");
    58. }
    59. if (1 <= input && input <= 8)
    60. {
    61. printf("请输入:\n");
    62. scanf("%d %d", &x, &y);
    63. printf("%d\n", (*pi[input])(x, y));
    64. }
    65. return 0;
    66. }

    结果:

    二.回调函数.

    把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应.本质上回调函数就是⼀个通过函数指针调⽤的函数

    对例题一:

    我们通过回调函数来实现它

    代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. void Menu()
    5. {
    6. printf("***************************\n");
    7. printf("***** 0.quit ********\n");
    8. printf("***** 1.Add ********\n");
    9. printf("***** 2.Sub ********\n");
    10. printf("***** 3.Mul ********\n");
    11. printf("***** 4.Div ********\n");
    12. printf("***** 5.Mod ********\n");
    13. printf("***** 6.Lsh ********\n");
    14. printf("***** 7.Rsh ********\n");
    15. printf("***************************\n");
    16. }
    17. int Add(int x, int y)
    18. {
    19. return x + y;
    20. }
    21. int Sub(int x, int y)
    22. {
    23. return x - y;
    24. }
    25. int Mul(int x, int y)
    26. {
    27. return x * y;
    28. }
    29. int Div(int x, int y)
    30. {
    31. return x / y;
    32. }
    33. int Mod(int x, int y)
    34. {
    35. return x % y;
    36. }
    37. int Lsh(int x, int y)
    38. {
    39. return x << y;
    40. }
    41. int Rsh(int x, int y)
    42. {
    43. return x >> y;
    44. }
    45. void cala(int(*pi)(int , int ))
    46. {
    47. int x = 0;
    48. int y = 0;
    49. printf("请输入:\n");
    50. scanf("%d %d", &x, &y);
    51. printf("%d\n", pi(x, y) );
    52. }
    53. int main()
    54. {
    55. Menu();
    56. int x = 0;
    57. int y = 0;
    58. int input = 0;
    59. printf("请输入:\n");
    60. scanf("%d", &input);
    61. do
    62. {
    63. switch (input)
    64. {
    65. case 0:
    66. {
    67. printf("退出,欢迎下次使用\n");
    68. break;
    69. }
    70. case 1:
    71. {
    72. cala(Add);
    73. break;
    74. }
    75. case 2:
    76. {
    77. cala(Sub);
    78. break;
    79. }
    80. case 3:
    81. {
    82. cala(Mul);
    83. break;
    84. }
    85. case 4:
    86. {
    87. cala(Div);
    88. break;
    89. }
    90. case 5:
    91. {
    92. cala(Mod);
    93. break;
    94. }
    95. case 6:
    96. {
    97. cala(Lsh);
    98. break;
    99. }
    100. case 7:
    101. {
    102. cala(Rsh);
    103. break;
    104. }
    105. }
    106. } while (input);
    107. return 0;
    108. }

    三.sqort函数

    1.头文件为#include

    2.里面有四个形参,表里介绍的很详细了

    3.作用:其可以排序各种数据类型

    我们先来实现其排序整型:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. int compare(const void* a, const void* b)
    6. {
    7. return (*(int*)a - *(int*)b);
    8. }
    9. int main()
    10. {
    11. int arr[] = { 1,3,5,7,9,0,8,6,4,2 };
    12. qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]),compare);
    13. for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    14. {
    15. printf("%d ", *(arr + i));
    16. }
    17. return 0;
    18. }

    结果:

    排序结构体:

    代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. struct stduent
    6. {
    7. char name[20];
    8. int age;
    9. double score;
    10. };
    11. int compare1(const void* a, const void* b)
    12. {
    13. return strcmp(((struct stduent*)a)->name, ((struct stduent*)b)->name);
    14. }
    15. int compare2(const void* a, const void* b)
    16. {
    17. return (*(int*)a-*(int*)b);
    18. }
    19. int compare3(const void* a, const void* b)
    20. {
    21. return (*(int*)a - *(int*)b);
    22. }
    23. void test1()
    24. {
    25. struct stduent arr1[] = {{"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0}};
    26. qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare1);//比名字
    27. for (int i = 0; i < 3; i++)
    28. {
    29. printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);
    30. }
    31. printf("结束\n");
    32. }
    33. void test2()
    34. {
    35. struct stduent arr1[] = { {"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0} };
    36. qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare2);//比年龄
    37. for (int i = 0; i < 3; i++)
    38. {
    39. printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);
    40. }
    41. printf("结束\n");
    42. }
    43. void test3()
    44. {
    45. struct stduent arr1[] = { {"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0} };
    46. qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare1);//比成绩
    47. for (int i = 0; i < 3; i++)
    48. {
    49. printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);
    50. }
    51. printf("结束\n");
    52. }
    53. int main()
    54. {
    55. test1();
    56. test2();
    57. test3();
    58. return 0;
    59. }

    结果:

    实现sqort函数:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. int compare(const void* a, const void* b)
    4. {
    5. return (*((int*)a) - *((int*)b));
    6. }
    7. void swap(const void* x, const void* y, int size)
    8. {
    9. for (int i = 0; i < size; i++)
    10. {
    11. char temp = *((char*)x+i);
    12. *((char*)x + i) = *((char*)y + i);
    13. *((char*)y + i) = temp;
    14. }
    15. }
    16. void Bubble(void* arr, int count, int b, int compare(void*, void*))
    17. {
    18. for (int i = 0; i < count - 1; i++)
    19. {
    20. for (int j = 0; j < count - 1 - i; j++)
    21. {
    22. if (compare((char*)arr + j * b, (char*)arr + (j + 1) * b) > 0)
    23. {
    24. swap((char*)arr + j * b, (char*)arr + (j + 1) * b, b);
    25. }
    26. }
    27. }
    28. }
    29. int main()
    30. {
    31. int arr[10] = { 0 };
    32. int sz = sizeof(arr) / sizeof(arr[0]);
    33. for (int i = 0; i < sz; i++)
    34. {
    35. scanf("%d",arr+i);
    36. }
    37. Bubble(arr, sz, sizeof(arr[0]), compare);
    38. //输出
    39. for (int i = 0; i < sz; i++)
    40. {
    41. printf("%d ", *(arr + i));
    42. }
    43. return 0;
    44. }

    最后,祝福各位学习天天进步!!!

  • 相关阅读:
    换掉 Postman + Swagger + JMeter,这 5 个 Java 项目绝了
    JVM字节码文件浅谈
    【网络安全入门】学习网络安全必须知道的100 个网络基础知识
    ModuleNotFoundError_ No module named ‘Crypto‘
    Qt Quick、QML01——QML内容结构介绍
    SpringBatch(9):ItemReader详解
    一体多面:哪有什么DO、BO、DTO,只不过是司空见惯的日常
    实战演练 | 使用纯 SQL 将表复制到新表
    【diffusion model】扩散模型入门
    SpringBoot与mockito那点事
  • 原文地址:https://blog.csdn.net/2301_79813267/article/details/134484582