• 实现深度理解函数指针


    对于函数想必大家早已感觉不是很陌生,指针现如今也有着自己独特的了解与认识,但是,对于函数指针不知道屏幕前的您,又能了解多少呢???

    对于函数指针,顾名思义,就是指向函数的指针

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

      函数的指针是指函数的入口地址,和数组名代表数组的首地址一样,函数名代表函数的入口地址!若有一个指针变量,存放某一个函数的入口,我们可以通过指向这个函数的指针变量来调用函数!

    指向函数的指针变量一般定义为:  类型说明符 ( *  指针变量名 )( )

    上述的类型说明符是指:指针变量所指向的函数返回值的类型!列 如:  int ( * p)( );

    定义了一个指向函数的指针变量p,它就可以存放一类整型函数的入口地址,主程序中把一个函数的入口地址赋值给它,它就指向哪一个函数!

    下面请看代码:

    1. #include
    2. int add(int x, int y)
    3. {
    4. return x + y;
    5. }
    6. int main()
    7. {
    8. int arr[10] = { 0 };
    9. printf("%p\n", &arr);
    10. printf("%p\n", arr);
    11. printf("\n");
    12. printf("%p\n", add);
    13. printf("%p\n", &add);
    14. return 0;
    15. }

    上面代码就是将数组名与&数组名,相比较,代码的运行结果为:

    大家可以看上面代码的运行结果:答案是显而易见的,对于笔者的专门分开,并将其类比!希望大家可以看出来结果!!

    &arr 取出的是整个数组的地址,而 arr是数组名,数组名是数组首元素的地址!!

    因此:&add 与  add都是函数的地址,没有什么区别!

    对于上述代码进行完善:

    1. #include <stdio.h>
    2. int add(int x, int y)
    3. {
    4. return x + y;
    5. }
    6. int main()
    7. {
    8. //int arr[10] = { 0 };
    9. //int(*p)[10] = &arr;
    10. int (*pf)(int x, int y) = &add;
    11. int sum = (*pf)(3, 5);
    12. printf("sum=%d\n", sum);
    13. return 0;
    14. }

    上述代码中,pf就是函数指针变量!

    在定义pf的类型的时候,我们借鉴了上面的int(*p)[10] = &arr; 所以显得简单化了!

    对于上述代码的运行结果为:

    上述代码的可更改部分为:

    1. (int ,int ) add
    2. int (*pf)(int x, int y) = &add;
    1. int sum = (*pf)(3, 5);
    2. pf(3 , 5)
    3. add(3 , 5)

    借鉴上述代码,对于函数指针的定义我们可以用以下的代码概述:

    1. int test(const char* str, double d)
    2. { }
    3. int main()
    4. {
    5. int (*pt)(const char*, double) = &test;
    6. int (*pt)(const char* str, double d) = &test;
    7. }

    思考一下:对于下列代码:出自于《C陷阱与缺陷》:如何去思考!

    * (void(*)( ))0( )

    上述代码:一句话,可以概述为:

    把0直接转化为void(*)()的函数指针,然后去调用0地址出的函数!

     void(*)函数的指针类型

    ( void(*)())0   :把0当作一个函数的地址

    把0 强制类型转化为:void (*)()类型的函数!!

  • 相关阅读:
    时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解
    【c#版本Openfeign】Net8 自带OpenFeign实现远程接口调用
    共享单车(二):项目日志
    Shiro去掉登录时url里的JSESSIONID,允许分号 中文参数
    用于设计 CNN 的 7 种不同卷积
    Shell脚本之linux服务器磁盘利用率监控
    “套壳”OpenAI,注定消亡!全球首个 20 万字大模型发布丨 RTE 开发者日报 Vol.63
    RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了,该如何解决?
    权重衰减----添加正则化(多层感知机)
    【Java基础篇 | 类和对象】--- 聊聊什么是内部类
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126793595