• c语言进阶部分详解(指针进阶2)


    大家好!我快马加鞭接着写出指针部分part2部分。第一部分见:c语言进阶部分详解(指针进阶1)_总之就是非常唔姆的博客-CSDN博客

    指针初阶部分见:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客 


    一.函数指针 

    1.讲解与实例 

    函数指针: 在C语言中,函数指针是指向函数的指针变量。它可以像其他变量一样存储在内存中,并且可以通过函数指针来调用相应的函数。

    声明函数指针:returnType (*pointerName)(parameterTypes);

    其中:

    • returnType 是函数的返回类型。
    • pointerName 是函数指针的名称。
    • parameterTypes 是函数的参数类型
    1. // 定义一个函数
    2. int add(int a, int b) {
    3. return a + b;
    4. }
    5. int main()
    6. {
    7. // 声明一个函数指针
    8. int (*funcPtr)(int, int);
    9. // 将函数指针指向add函数
    10. funcPtr = add;
    11. // 通过函数指针调用函数
    12. int result = funcPtr(2, 3); // 结果为5 平时调用函数时都是函数名(地址),也可以想通
    13. int result = (*funcPtr)(2, 3); // 这两种均可以,funcPtr是地址,通过*解引用来找到
    14. return 0;
    15. }

     2.《C陷阱和缺陷》中两段经典代码

    2.1 ( * ( void  ( * )( ) ) 0 ) ( );

    //代码1     ( * ( void  ( * )( ) ) 0 ) ( );

    1. void  ( * )( )这是一个函数指针的类型声明。它表示一个没有参数并且返回类型为void的函数指针
    2. ( void  ( * )( ) )0 这是对0进行强制类型转化,转换为函数指针类型
    3. * ( void  ( * )( ) ) 0 对地址为0的函数地址解引用
    4.  ( * ( void  ( * )( ) ) 0 ) ( ) 调用这个函数

    2.2void ( * signal( int , void( * ) ( int ) ) ) (int); 

    //代码2 void ( * signal( int , void( * ) ( int ) ) ) (int); 

    void (*signal(int, void (*)(int)))(int):这是一个函数声明的语法。它表示signal是一个函数,接受两个参数:一个int类型的参数和一个指向接受int类型参数并返回void的函数指针的参数。该函数返回一个指向接受int类型参数并返回void的函数指针的结果


    二.函数指针数组

    1.讲解与实例

    函数指针数组: 函数指针数组是一个数组,其中的每个元素都是一个函数指针。可以将不同的函数指针存储在数组中,并根据需要使用它们 

    声明函数指针数组:return_type (*array_name[size])(parameter_list); 

    1. return_type:函数指针指向的函数的返回类型。
    2. (*array_name):函数指针数组的名称。它是一个指针,指向一个数组。
    3. [size]:函数指针数组的大小。它表示数组中函数指针的数量。
    4. (parameter_list):函数指针指向的函数的参数列表

     相比于函数指针只是多了一个[ ]在函数名后面而已

    1. // 定义函数1
    2. void func1(int num) {
    3. printf("This is function 1. Number: %d\n", num);
    4. }
    5. // 定义函数2
    6. void func2(int num) {
    7. printf("This is function 2. Number: %d\n", num);
    8. }
    9. // 定义函数3
    10. void func3(int num) {
    11. printf("This is function 3. Number: %d\n", num);
    12. }
    13. int main() {
    14. // 将函数指针赋值给函数指针数组的元素
    15. void(*pf[3])(int) = { &func1,&func2, &func3 };
    16. // 调用函数指针数组中的函数
    17. for (int i = 0; i < 3; i++) {
    18. pf[i](i);
    19. }
    20. return 0;
    21. }

    2.使用来实现计算器

    1. void menu()
    2. {
    3. printf("******************************\n");
    4. printf("*** 1.add 2.sub ***\n");
    5. printf("*** 3.mul 4.div ***\n");
    6. printf("*** 0.exit ***********\n");
    7. printf("******************************\n");
    8. }
    9. int add(int x, int y)
    10. {
    11. return x + y;
    12. }
    13. int sub(int x, int y)
    14. {
    15. return x - y;
    16. }
    17. int mul(int x, int y)
    18. {
    19. return x * y;
    20. }
    21. int div(int x, int y)
    22. {
    23. return x / y;
    24. }
    25. int main()
    26. {
    27. int input = 1;
    28. int result = 0;
    29. int a = 0;
    30. int b = 0;
    31. while (input)
    32. {
    33. menu();
    34. printf("请输入:\n");
    35. scanf("%d", &input);//根据menu来输入数字啦
    36. int(*pf[5])(int, int) = { NULL,add,sub,mul,div };//第一个是NUll是为了使数字与菜单对应
    37. if (input >= 1 && input <= 4)
    38. {
    39. printf("请输入两个数\n");
    40. scanf("%d %d", &a, &b);
    41. result = pf[input](a, b);
    42. printf("%d\n", result);
    43. }
    44. else if(input==0)
    45. {
    46. printf("退出计算器");
    47. }
    48. else
    49. {
    50. printf("输入有误,请重新输入");
    51. }
    52. }
    53. return 0;
    54. }

    三.指向函数指针数组的指针
     

    指向函数指针数组的指针是一个 指针,指针指向一个数组 ,数组的元素都是函数指针
     

    指向函数指针数组的指针的语法如下:

    return_type (*(*pointer_name)[size])(parameter_list);

    1. return_type:函数指针指向的函数的返回类型。
    2. (*pointer_name):指向函数指针数组的指针的名称。它是一个指针,指向一个函数指针数组。
    3. [size]:函数指针数组的大小。它表示数组中函数指针的数量。
    4. (parameter_list):函数指针指向的函数的参数列表

    相比与函数指针数组只是在名字前多一个*来说明是指针而已


    四.回调函数

    1.讲解 

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应

     2.事例

    1. int add(int x, int y)
    2. {
    3. return x + y;
    4. }
    5. // 定义一个回调函数
    6. void callback(int result)
    7. {
    8. printf("回调函数被调用,结果为:%d\n", result);
    9. }
    10. // 定义一个函数,接受一个函数指针作为参数
    11. void performOperation(int (*operation)(int, int), int a, int b, void (*callback)(int))
    12. {
    13. int result = operation(a, b);
    14. callback(result);
    15. }
    16. int main()
    17. {
    18. // 调用函数,并传递回调函数作为参数
    19. performOperation(add, 2, 3, callback);
    20. return 0;
    21. }

     今天的内容先到这里了,下一次不出意外是针对回调函数进行更加详细事例演示及模拟。

    感谢大家的支持!!

  • 相关阅读:
    天融信上网行为管理系统设置wifi短信验证流程
    图论(算法竞赛、蓝桥杯)--Dijkstra算法最短路
    【论文复现】——基于逐点前进法的点云数据精简
    创建计划协议、维护创建计划、收货
    带你了解数据库的存储过程
    怎样选择合适的CRM客户管理系统?
    【Spring Cloud】基于 Feign 实现远程调用,深入探索 Feign 的自定义配置、性能优化以及最佳实践方案
    多线程互斥锁 pthread_mutex 的使用及初始化问题
    让“作用域和闭包”说人话
    springcloud集成链路追踪组件skywalking
  • 原文地址:https://blog.csdn.net/qq_74415153/article/details/133133084