C语言里的“反义词兄弟”:指针函数 vs 函数指针
📅 2026/7/11 1:01:50
👁️ 次浏览
在C语言中指针函数和函数指针是两个极易混淆的概念。它们的名字只是词序不同但含义截然相反。下面我将从定义、用法、典型场景到复杂声明为你彻底厘清这两个概念。一、指针函数 —— 返回指针的函数1. 概念指针函数本质上是一个函数它的返回值类型是一个指针也就是一个地址。2. 定义格式int *func(int a, int b); // func 是函数返回 int* 类型的指针解读func先和(int a, int b)结合说明它是一个函数函数的返回值是int *类型。3. 典型例子返回一个静态变量的地址char *get_weekday(int n) { static char *weekdays[] { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; if (n 1 || n 7) return NULL; return weekdays[n - 1]; } char *day get_weekday(3); // day 指向 Wednesday注意这里使用了static修饰数组因为如果返回局部非静态数组的地址函数退出后该内存会被回收返回的指针就是“野指针”。返回动态分配的内存int *create_array(int size) { int *p (int *)malloc(size * sizeof(int)); return p; // 返回堆内存的指针 }这是合法的因为堆内存的生命周期由程序员手动控制。但调用方必须记得free。4. 注意事项绝不能返回局部非静态变量的地址。返回的指针在使用前需检查是否为空如malloc失败。返回指针的函数常用于分配资源、查找子串、返回结构体指针等场景。二、函数指针 —— 指向函数的指针1. 概念函数指针是一个指针变量它存储的是函数的入口地址。通过它可以间接调用函数如同通过数据指针间接访问变量一样。2. 定义格式int (*p)(int, int); // p 是指针指向 返回值为int、参数为(int, int) 的函数解读因为括号的优先级*p先结合表明p是一个指针然后外面是函数的调用操作符(int, int)表明它指向一个函数函数返回int。若不写括号int *p(int, int)则声明的是一个指针函数返回int*的函数所以括号非常关键。3. 初始化与调用int add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; } int (*pfunc)(int, int) add; // 初始化取地址符可以省略等价于 add int result pfunc(3, 4); // 通过指针调用等价于 (*pfunc)(3, 4)4. 主要用途(1) 回调函数将函数作为参数传给另一个函数实现灵活的定制行为。标准库的qsort就是典型例子#include stdlib.h int cmp_int(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int arr[] {5, 2, 8, 1, 9}; qsort(arr, 5, sizeof(int), cmp_int); // cmp_int 就是一个函数指针实参(2) 函数指针数组将一系列函数按序号放入数组实现类似“跳转表”的功能常用于菜单驱动、有限状态机等。void func0() { printf(Menu 0\n); } void func1() { printf(Menu 1\n); } void func2() { printf(Menu 2\n); } void (*menu[])(void) {func0, func1, func2}; int choice 1; if (choice 0 choice 3) menu[choice](); // 调用 func1(3) 结构体中的函数指针可在结构体中封装“行为”模拟简易的面向对象。struct Calculator { int (*op)(int, int); }; int multiply(int a, int b) { return a * b; } struct Calculator calc; calc.op multiply; int product calc.op(6, 7); // 425. 复杂声明与typedef简化函数指针的声明如果嵌套多层会非常难读例如void (*(*pf)(int, void (*)(int)))(int);这种时候强烈推荐用typedef分步定义typedef void (*Callback)(int); // 函数指针类型参数int返回void typedef Callback (*ComplexFunc)(int, Callback); // 返回 Callback 的函数指针 ComplexFunc pf; // 这样清晰多了三、核心区别对比项目指针函数函数指针本质函数返回值为指针变量存储函数地址声明示例int *f(int);int (*f)(int);用法调用后得到一个地址通过它调用所指的函数常见场景动态内存分配、返回字符串数组回调、策略模式、跳转表内存占用函数体代码 返回值指针只占一个指针大小的内存4/8 字节语法中的括号不需要额外括号必须用括号将*和指针名括起来四、一张 Mermaid 脑图帮你记住五、小结指针函数的核心是“函数”它返回一个地址函数指针的核心是“指针”它指向一个函数。书写时牢记括号的优先级int (*p)()表示p是指针int *p()表示p是函数返回指针。熟练掌握函数指针是理解回调机制、编写灵活库和阅读Linux内核源码等进阶内容的基础。
1. 当“正常运行”成了一种不安你有没有过这种体验——写好一个 C 程序,部署到服务器上,过了一天,没崩。两天,还是稳如老狗。等到第三天,你盯着监控面板,内存曲线平得像心跳停止了一样,CPU 也没…
📅 2026/7/11 1:01:50
深度解析:开源实时数据采集工具的完整实战指南 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2025最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher
在当今直播电商和内容创作者…
📅 2026/7/11 1:00:50
Chrome DevTools Elements 面板 5 个高阶调试技巧:从样式覆盖到 DOM 断点实战1. 精准定位样式冲突的三种策略前端开发中最令人头疼的问题莫过于样式覆盖和冲突。当页面元素没有按照预期显示时,传统做法是手动检查每个CSS规则,这种方法效率低下…
📅 2026/7/11 1:00:50
《新程序员》2024技术期刊深度评测:云原生与软件定义汽车的实践洞察翻开最新一期《新程序员》,油墨香气中混合着代码的味道——这或许就是技术媒体在数字时代的独特浪漫。作为CSDN旗下延续20年的技术期刊品牌,《新程序员》在2024年完成了从传…
📅 2026/7/11 1:53:11
7月10日,台风巴威继续逼近浙闽沿海。根据中央气象台7月10日18时发布的台风橙色预警,今年第9号台风巴威预计将于7月12日凌晨在浙江温岭至福建霞浦一带沿海登陆,登陆后强度逐渐减弱。国家防总已在7月9日17时将针对浙江、福建的防汛防台风四级应…
📅 2026/7/11 1:53:11
贴片与插件PPTC深度对比:5大应用场景选型策略与3项关键性能实测在电路保护领域,自恢复保险丝(PPTC)的选择往往让硬件工程师陷入两难——贴片式(SMD)和插件式(THT)两种封装各有所长&a…
📅 2026/7/11 1:53:11
前言
作为一名前端开发者,你可能经历过这样的场景:本地跑得好好的项目,拉取同事的另一个仓库一运行,node-gyp 编译直接挂掉,报一堆看不懂的 C 错误。折腾半天才发现,自己全局用的是 Node 24,而…
📅 2026/7/11 1:53:11
免费解锁B站大会员4K视频:高效批量下载工具完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader
还在为B站视频无法离线…
📅 2026/7/11 1:53:11
在AI技术快速发展的今天,模型与Agent已成为开发者必须掌握的核心概念。无论是从事机器学习、自然语言处理还是智能系统开发,理解模型与Agent的关系以及如何在实际项目中平衡性能与成本,都是提升技术能力的关键。本文将围绕模型与Agent的技术本…
📅 2026/7/11 1:52:10
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54