C/C++易错点:函数指针与指针函数的核心区别与避坑指南

embedded/2025/3/1 5:14:12/

一、核心定义与语法对比

特性指针函数>指针函数指针>函数指针
本质函数(返回值为指针类型)指针变量(指向函数的地址)
声明语法int* func(int a, int b);int (*func)(int a, int b);
关键符号位置*靠近返回值类型(属于数据类型)*与函数名结合(属于指针变量名)
典型应用场景动态内存分配、返回数组/结构体指针回调函数、策略模式、动态函数调用

形象比喻

  1. “遥控器”指针>函数指针是一个指向函数的指针,类似遥控器上的按钮,按下后执行对应的函数功能。例如,遥控器上的“播放”键指向播放函数,“暂停”键指向暂停函数。
  2. 生产指针的工厂”指针函数>指针函数本质上是一个函数,它的“产品”是一个指针(地址)。例如,工厂A专门生产地址,调用它时会返回一个地址值。

记忆技巧

  1. 看括号位置:
    • * 被括号包裹(如(*func)),则是指针>函数指针
    • *靠近返回值(如int* func),则是指针函数>指针函数。
  2. 用途联想:
    • 需要“生产地址”时用指针函数>指针函数(如malloc封装);
    • 需要“灵活调用函数”时用指针>函数指针(如多态逻辑)

二、核心区别详解

  1. 本质差异

    • 指针函数>指针函数:本质是函数,其返回值是某种类型的指针(地址)。例如:
      int* create_array(int size) { return (int*)malloc(size * sizeof(int)); 
      }  // 返回动态数组的首地址
      
    • 指针>函数指针:本质是指针变量,存储函数的入口地址。例如:
      int add(int a, int b) { return a + b; }
      int (*func_ptr)(int, int) = &add;  // 指向add函数的指针
      
  2. 语法辨析

    • 指针函数>指针函数:int* func()中的*属于返回值类型,表示返回int*类型。
    • 指针>函数指针int (*func)()中的*修饰函数名,表示func指针变量,指向一个返回int且无参数的函数。
  3. 调用方式

    • 指针函数>指针函数:直接调用函数名获取指针结果:
      int* arr = create_array(10);  // 调用指针函数>指针函数
      
    • 指针>函数指针:通过指针调用目标函数:
      int result = (*func_ptr)(3, 5);  // 显式调用
      // 或简写为:int result = func_ptr(3, 5);
      

三、典型应用场景

  1. 指针函数>指针函数的使用场景
  • 动态内存分配:返回堆内存指针(需手动释放)。
    char* copy_str(const char* src) {char* dest = (char*)malloc(strlen(src) + 1);strcpy(dest, src);return dest;
    }
    
  • 返回结构体/数组指针:避免拷贝大对象。
    struct Point* create_point(int x, int y) {struct Point* p = (struct Point*)malloc(sizeof(struct Point));p->x = x; p->y = y;return p;
    }
    
  1. 指针>函数指针的使用场景
  • 回调函数:将函数作为参数传递。
    void process_data(int* data, int size, void (*callback)(int)) {for (int i = 0; i < size; i++) {callback(data[i]);  // 对每个元素执行回调函数 }
    }
    
  • 策略模式:运行时动态切换算法。
    int strategy_add(int a, int b) { return a + b; }
    int strategy_sub(int a, int b) { return a - b; }
    int (*strategy)(int, int) = condition ? &strategy_add : &strategy_sub;
    int result = strategy(10, 5);
    

四、高级用法与注意事项

  1. 指针>函数指针数组
    定义多个同类型函数的指针数组,实现多态调用:

    void (*ops[])(int) = {&func1, &func2, &func3};  // 指针>函数指针数组 
    ops
    
  2. 类成员指针>函数指针(C++)
    C++中需区分静态与非静态成员指针>函数指针

    class Calculator {
    public:static int static_add(int a, int b) { return a + b; }int add(int a, int b) { return a + b; }
    };
    // 静态成员指针>函数指针 
    int (*static_ptr)(int, int) = &Calculator::static_add;
    // 非静态成员指针>函数指针 
    int (Calculator::*member_ptr)(int, int) = &Calculator::add;
    Calculator obj;
    (obj.*member_ptr)(3, 5);  // 调用非静态成员函数
    
  3. 避免常见错误

    • 指针函数>指针函数返回值:若返回局部变量地址会导致悬垂指针,应返回堆内存或静态变量地址。
    • 指针>函数指针类型匹配:参数列表和返回值必须与目标函数严格一致,否则行为未定义。

五、总结

维度指针函数>指针函数指针>函数指针
核心目的提供指针类型的返回值实现函数的动态调用与传递
内存管理需关注返回值内存生命周期(如手动释放)无需管理,仅存储函数地址
扩展性适用于资源创建场景支持灵活的策略切换和模块解耦

http://www.ppmy.cn/embedded/168970.html

相关文章

使用python做http代理请求

有这样一个需求现在有两台A&#xff0c;B两台电脑组成了一个局域网&#xff0c;在A电脑上开发webjava应用&#xff0c;需要调用第三方接口做http请求&#xff0c;但是这个请求只能在B电脑上请求。 一种解决方案&#xff1a;自定义一个中间服务&#xff0c;在电脑B上运行一个简…

JAVA面试常见题_基础部分_mybatis面试题

1、什么是 MyBatis&#xff1f; 答&#xff1a;MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 2、讲下 MyBatis 的缓存答 &#xff1a;MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打…

R语言基础| 基本统计分析

写在前面 R语言拥有丰富的数据处理、统计分析和机器学习工具包&#xff0c;涵盖了从简单的描述统计到复杂的模型建立的各个方面。再加上数据的处理可以完美的衔接后续的可视化&#xff0c;这使得它成为处理各种类型和规模的数据集的理想选择。 完整R语言教程和测试数据可见&a…

游戏加速器核心引擎解析:从技术原理到实现思路

摘要 随着网络游戏对低延迟、高稳定性的需求不断增加&#xff0c;游戏加速器应运而生。本文将详细解析游戏加速器的核心引擎&#xff0c;探讨其背后的技术架构、关键算法以及常见的挑战与解决方案&#xff0c;旨在为开发者提供技术参考。 1. 引言 网络游戏在跨国、跨地区联机时…

transformer架构的语言模型保存的内容与格式详解

前文我们已经详细讲述了基于pytorch框架下的transformer架构如何从零开始构建一个小型字符级语言模型,构建过程中涵盖数据准备、模型架构设计、训练、评估与生成的整个流程。我们已经了解了各个部分的细节,而且已经提供了完整的python代码。现在需要了解我们构建好的模型如何…

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址&#xff1a;GitHub - deepseek-ai/FlashMLA 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天&#xff01; ​ 一、开源周震撼启幕 继上周预告后&#xff0c;DeepSeek于北京时间今晨9点准时开源「FlashMLA」&#xff0c;打响开源周五连…

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后&#xff0c;一场关乎数字世界秩序的攻防战正在上演&#xff1a;AI生成的深度伪造视频导致企业品牌声誉损失日均超千万&#xff0c;批量生成的侵权内容使版权纠纷量与日俱增&#xff0c;黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…

永洪科技旗下BI产品,成功入选“金融信创优秀解决方案“

3月28日至29日&#xff0c;金融信创生态实验室在京举办金融信创解决方案研讨会&#xff0c;发布第三期金融信创优秀解决方案、实验室推荐解决方案&#xff0c;启动解决方案的分享活动。 永洪科技凭借旗下的敏捷BI数据分析平台&#xff0c;成功入选“金融信创优秀解决方案&…