• C语言函数指针


    一、什么是函数指针

    函数指针是存放函数地址的指针变量

      

    如何获得函数的地址?

    1.&函数名:和其他数据获得地址一样,通过&函数名即可获得地址

    2.函数名:函数名本身值也是函数的地址

     

    1. int Add(int x, int y)
    2. {
    3. return x + y;
    4. }
    5. int main()
    6. {
    7. printf("%p\n", &Add);
    8. printf("%p\n", Add);
    9. return 0;
    10. }

     

    函数指针的类型是什么?

    以 int Add(int x, int y)函数为例,代码如下

    函数指针的类型是:int(*)(int, int)

    (*)表示p/q是一个指针变量

    后面的(int,int)表示函数的参数类型

    前面的int表示函数的返回值类型

    1. int Add(int x, int y)
    2. {
    3. return x + y;
    4. }
    5. int main()
    6. {
    7. int(*p)(int, int) = &Add;
    8. int(*q)(int, int) = Add;
    9. printf("%p\n", p);
    10. printf("%p\n", q);
    11. return 0;
    12. }

     二、函数指针如何使用?

    解引用函数指针变量 或 直接使用函数指针变量

    1.解引用函数指针变量:

    解引用函数指针变量就是得到函数名,(*p)等价于Add

    2.直接使用函数指针变量:

    正常情况下,使用函数是 函数名(参数),我们知道函数名的值是函数地址,而指针变量的值也是函数的地址,那么是否可以直接用指针变量(参数)来调用函数呢?

    当然可以!直接使用p(3,5),代码如下:

    1. int Add(int x, int y)
    2. {
    3. return x + y;
    4. }
    5. int main()
    6. {
    7. int(*p)(int, int) = &Add;
    8. int ret1 = (*p)(3, 5);
    9. int ret2 = p(3, 5);
    10. printf("%d\n", ret1);
    11. printf("%d\n", ret2);
    12. return 0;
    13. }

    三、分析一行有趣的代码 

    该行代码的意思是:解引用函数指针进行函数调用

    void (*)() 是一个函数指针类型,该函数参数为空,返回值类型为void

    将void (*)() 放入括号中,(void (*)())是强制类型转换,(void (*)())0 即将0强制类型转换为函数指针类型

    (*(void (*)())0) 即解引用该函数指针,得到是函数名

    (*(void (*)())0) () 即函数名(),即使用函数,函数参数为空,无需传参

    1. int main()
    2. {
    3. (*(void (*)())0)();
    4. return 0;
    5. }

  • 相关阅读:
    HTML CSS 网页设计作业「动漫小站」
    Python使用traceback.print_exc()输出异常信息
    2022年杭电多校第四场补题记录
    Go 什么是循环依赖
    OPNET Modeler 的安装及其相关配置
    【Redis】Redis实现分布式锁
    重装系统步骤(Win7换Win10)
    04【Spring声明式事、传播行为、AOP事务控制】
    算法-合并 K 个升序链表
    商城系统 前后端交互 报文安全性问题 方案设计
  • 原文地址:https://blog.csdn.net/2301_76197086/article/details/133354611