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

嵌入式Day14--函数指针与指针函数

1.指针函数

函数的返回值是指针类型

char *strcpy(char *dst, const char *src); strcpy 这个函数的返回值就是一个指针。 成功,指针就指向dst。

需要注意的是:

  • 不能返回是局部作用域的指针。
  • 希望函数可以连续调用。即在同一个语句里面实现strcpy(str1,strcpy(str3,str2));
  • 希望返回一段内存区域 (数组,堆空间)。

2.函数指针

  • 前面介绍的指针基本都是指向数据。
  • 函数指针:指向一个函数。本质是指针变量;
  • 函数名其实是地址值。里面储存的代码是对数据进行加减乘除操作的。

目的:避免代码的重复,方便后期代码的扩展以及函数功能的解耦合。
回调函数:一个函数被当作参数,传递给另外一个函数。被传递的这个参数(函数指针,回调函
数)被动调用。主调函数只是传参(函数)。

语法 int add(int a, int b) // int (*) (int,int) { return a + b; } int main(int argc, char **argv) { int (*p)(int, int) = add; // p 函数指针。 add 不能写成add(), 不是对add函数的调用 int a = 10; int b = 20; int ret = 0; ret = add(a, b); printf("add() is %d\n", ret); ret = p(a, b); // 通过函数指针 对函数的调用 printf("p() is %d\n", ret); return 0; }
int div3(int num) // div3 -> int (*) (int) { return 0 == num %3; } int div5(int num) // div3 -> int (*) (int) { return 0 == num %5; } // int (*fun) (int) 函数指针 void find_num(int* a,int size, int (*fun) (int) ) { for(size_t i=0;i<size;i++) { if( fun(a[i])) // if( div5(a[i])) { printf("%d\n",a[i]); } } } int main(int argc, char **argv) { int a[10]={0}; fill_array(a,10); //find_num3(a,10); find_num(a,10,div5); // 传递函数名给 find_num return 0; }

3.typedef关键字

作用:取别名(给数据类型取别名)

3.1普通数据类型取别名

typedef 老数据类型名 新数据类型名 typedef unsigned char u8; typedef unsigned short u16; typedef char s8; int main(int argc, char **argv) { u8 a; // unsigned char u16 b; // unsigned short s8 c; // char return 0; }

3.2简化函数指针的写法

PFUN 是一个类型名 typedef int* (*PFUN)(int ,int ,char* ); // int* func(int a,int b ,char* c) // int* (*)(int ,int ,char* ) // { // return NULL; // } // int func2(int a,int b, int* (*pfun)(int ,int ,char* )) // { // return 0; // } int* func(int a,int b ,char* c) // int* (*)(int ,int ,char* ) { return NULL; } int func2(int a,int b, PFUN pfun) // int a; { char str[]={0}; pfun(1,2,str); return 0; }
http://www.jsqmd.com/news/813716/

相关文章:

  • 3步搞定视频硬字幕提取:本地化、多语言、高效率的终极解决方案
  • 尾盘选股法程序开发学习初期
  • 08:redis-实战+原理
  • 基于MCP协议实现AI助手安全远程操控服务器的完整指南
  • 番茄小说下载器终极指南:一键获取全网小说并智能转换格式
  • AI Agent驱动的智能着陆页生成:从概念到Next.js工程实践
  • 我到底是不是嘉豪?
  • 基于Semantic Release与GitHub Actions的前端自动化发布流程实战
  • 哈密顿赞颂拉格朗日方程为“科学的诗篇“
  • 逃离“时间回廊”:深度解析华为 FusionCompute 虚拟机时间回退迷局
  • 如何使用 Jenkins 流水线自动构建并推送 Docker 镜像到私有仓库
  • Scrapstyle:基于样式解析的现代Web数据抓取方案
  • MPC轨迹规划与控制算法【附代码】
  • Sunshine游戏串流服务器:快速搭建你的终极跨平台游戏串流系统
  • 城市规划和软件系统设计:复杂度管理的艺术
  • PUBG罗技鼠标宏:5分钟快速上手自动压枪终极指南
  • Ollama Operator:在Kubernetes上轻松部署与管理大语言模型
  • 深入查看Taotoken用量看板分析API调用消耗与优化建议
  • BrowserTools MCP:让AI助手安全操控浏览器的本地化工具详解
  • GPU硬件加速优化:体积渲染与3D高斯泼溅技术
  • 基于Go与K8s Client-go实现多租户应用一键部署API服务
  • 在澳洲,名义雇主合法吗?如何确保合规与效率?
  • 自签名证书
  • Perplexity引用导出结果不可复现?独家“引用指纹”校验技术首次公开,误差率降至0.02%以内!
  • 多模型选型场景下如何利用Taotoken模型广场进行决策
  • RanjuUI:轻量级现代UI组件库的设计理念与工程实践
  • 终极Figma到JSON转换解决方案:为企业级设计开发一体化构建技术桥梁
  • 摩尔线程 × 光轮智能|强强联手,共筑国产具身智能仿真底座
  • 用苏格拉底式提问规则提升LLM输出质量:原理、实践与集成指南
  • 情感化导航系统:基于上下文感知与自然语言生成的智能交互实践