当前位置: 首页 > news >正文

论函数指针

函数指针是一种特殊的指针,指向函数的内存地址,允许通过指针来调用函数。

1.函数指针的声明与定义

需要指定:

被指向函数的返回值类型

被指向函数的参数类型列表(不需要参数名)

语法格式:

返回值类型(* 指针变量名)(参数类型1,参数类型2,...);void (*fun)(int);

为什么只需要传入函数参数类型?

1.函数指针的本质是”函数类型的抽象“

        函数指针的作用是指向具有特定“调用形式”的函数,而“调用形式”由两部分决定:

        参数的类型序列(如(int,double))

        返回值类型(如void、int)

参数名只是函数定义时的局部标识符,用于函数内部逻辑处理,并不影响函数的“调用形式”。

2.函数指针的声明是“类型匹配”的约定

函数指针声明的语法本质上是一种类型约定v:它规定了“被指向函数必须接受什么类型的参数,返回什么类型的值”。

3.参数名在函数指针中是“冗余信息”

函数指针的作用是传递函数的“调用入口”,而不是传递函数的实现细节。当通过函数指针调用函数时,实际传递的是参数的值,编译器只需要确保参数的类型与函数指针声名的参数类型一致。

2.函数指针作为函数参数(回调函数)

函数指针最常用的场景是作为其他函数的参数,实现“回调机制” ——让被调用的函数反过来调用传入的函数。

#include <iostream>
#include <vector>using namespace std;void PrintValue(int value)
{cout << "value :" << value << endl;
}void ForEach(const vector<int>& values,void (*func)(int))
{for(int value : values)func(value);
}int main()
{vector<int> values ={1,3,5,2,4};ForEach(values,PrintValue);return 0;
}

3.函数指针与Lambda

#include <iostream>
#include <vector>using namespace std;void ForEach(const vector<int>& values,void (*func)(int))
{for(int value : values)func(value);
}int main()
{vector<int> Value ={1,3,2,4,5};ForeEach(Value,[](int value){cout << "value :"<<value << endl;});return 0;
}

4.函数指针的注意事项

类型严格匹配:函数指针的参数类型、返回值类型必须与被指向的函数完全一致,否则会编译错误

避免指向空或失效函数:未初始化的函数指针或指向已销毁函数的指针(如局部函数)调用时会导致未定义行为

简化声明:复杂的函数指针可以用typdef或using简化:

//定义别名
using FunPtr = void (*)(int);//等价于 typedef void (*FunPtr)(int);//使用别名
FunPtr ptr = print_num;

http://www.dtcms.com/a/340775.html

相关文章:

  • 深入分析Linux kobject 的工作原理与实现机制
  • 【C语言16天强化训练】从基础入门到进阶:Day 4
  • K8S-Pod资源对象——Pod探针
  • 基于深度学习CenterPoint的3D目标检测部署实战
  • MySQL的简单介绍
  • PyTorch API 5
  • 通过uniapp将vite vue3项目打包为android系统的.apk包,并实现可自动升级功能
  • PyTorch API 7
  • PiscCode集成Hand Landmarker:实现高精度手部姿态检测与分析
  • 查看文件内容
  • kotlin 协程笔记
  • 手机 浏览器调用摄像头扫描二维码Quagga
  • RAG系统文本检索优化:Cross-Encoder与Bi-Encoder架构技术对比与选择指南
  • 时序数据库IoTDB的列式存储引擎
  • 5G-A赋能AR眼镜:毫米级虚实融合的未来已来
  • Kubernetes 负载均衡现象解析:为何同一批次请求集中于单个 Pod
  • 小红书账号隔离:解决IP关联问题方案
  • AI 创业公司分析报告:RealRoots
  • 结合SAT-3D,运动+饮食双重养腰新方式
  • 3ds Max 流体模拟终极指南:从创建到渲染,打造真实液体效果
  • MySQL InnoDB事务acid特性的原理和隔离级别的实现原理
  • 机器学习——附录与补充
  • 【007TG洞察】Bitget全球快闪店活动解析:Web3项目如何实现高效用户增长
  • ios八股文 -- Objective-c
  • Java EE ----- Spring Boot 日志
  • 【JavaEE】(17) MyBatis 基础
  • 【JavaEE】多线程(线程安全问题)
  • k8sday12数据存储(1/2)
  • 【表的操作】
  • 开源大模型如何选择?GPT-OSS综合评估