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

C语言中函数指针和指针函数的定义及用法

在C/C++中,函数指针和指针函数是两个容易混淆但完全不同的概念。以下是它们的详细对比和学习指南,结合代码示例帮助你彻底掌握。

1. 函数指针(Function Pointer)

本质:一个指向函数的指针变量,用于动态调用函数。
用途:回调函数、策略模式、事件处理等。

语法与示例

// 声明一个函数指针类型(指向返回int,参数为int的函数)
typedef int (*FuncPtr)(int);// 示例函数
int square(int x) { return x * x; }
int cube(int x) { return x * x * x; }int main() {// 定义函数指针变量并指向函数FuncPtr ptr = square;printf("Square of 5: %d\n", ptr(5)); // 输出 25ptr = cube; // 切换指向的函数printf("Cube of 5: %d\n", ptr(5));   // 输出 125return 0;
}

关键点

  • 声明格式:返回值类型 (*指针名)(参数列表)
  • 应用场景:
    回调机制(如qsort的排序比较函数)。
    动态选择算法(如运行时选择加密函数)。

2. 指针函数(Pointer Function)

本质:一个返回指针的函数,本质上仍是函数。
用途:动态内存分配、返回数组/结构体指针等。

语法与示例

// 指针函数:返回int*的函数
int* createArray(int size) {int* arr = (int*)malloc(size * sizeof(int));for (int i = 0; i < size; i++) {arr[i] = i + 1;}return arr; // 返回动态分配的指针
}int main() {int* array = createArray(5);for (int i = 0; i < 5; i++) {printf("%d ", array[i]); // 输出 1 2 3 4 5}free(array); // 释放内存return 0;
}

关键点

  • 声明格式:返回值类型* 函数名(参数列表)

  • 注意事项:
    返回的指针需指向合法内存(如堆内存或静态变量)。
    避免返回局部变量的指针(会导致悬垂指针)。

3. 对比总结

特性函数指针指针函数
本质指向函数的指针变量返回指针的函数
声明示例int (*ptr)(int)int* func(int)
内存占用存储函数地址(通常4/8字节)函数本身无特殊内存占用
典型用途回调、动态绑定返回动态数据结构的指针
危险点空指针调用导致崩溃内存泄漏或悬垂指针

4. 进阶应用

函数指针数组

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }int main() {int (*ops[2])(int, int) = {add, sub}; // 函数指针数组printf("Add: %d\n", ops[0](3, 2));    // 输出 5printf("Sub: %d\n", ops[1](3, 2));    // 输出 1return 0;
}

复杂声明解析(右左法则)

  • 函数指针的指针函数:
    int* (funcPtr)(int) → funcPtr是指针,指向一个返回int的函数。

5. 常见面试题

以下代码的输出是什么?

void foo() { printf("Hello"); }
int main() {void (*ptr)() = foo;ptr();return 0;
}

答案:输出Hello,函数指针调用。

找出错误:

int* badFunc() {int x = 10;return &x; // 返回局部变量的地址!
}

错误:返回局部变量指针,函数结束后x被销毁,导致悬垂指针。

相关文章:

C语言中函数指针和指针函数的定义及用法

在C/C中&#xff0c;函数指针和指针函数是两个容易混淆但完全不同的概念。以下是它们的详细对比和学习指南&#xff0c;结合代码示例帮助你彻底掌握。 1. 函数指针&#xff08;Function Pointer&#xff09; 本质&#xff1a;一个指向函数的指针变量&#xff0c;用于动态调用…...

Spring Boot DevTools 热部署

在Spring Boot项目中加入 spring-boot-devtools 热部署依赖启动器后&#xff0c;通常不需要手动重启项目即可让更改生效。spring-boot-devtools 的核心特性之一就是自动重启或热加载。 Spring Boot DevTools 热部署关键知识点 &#x1f525; 目的&#xff1a;spring-boot-devt…...

unix/linux source 命令,其基本属性、语法、操作、api

现在像解剖精密仪器一样,来细致地审视 source (或 .) 命令的各个方面:它的属性、语法、操作方式,以及可以称之为“API”的交互接口。这种细致的分析有助于我们精确地理解和使用它。 让我们深入细节: 一、基本属性 (Core Attributes) 命令类型 (Command Type): Shell 内置…...

FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别

FPGA仿真中阻塞赋值和非阻塞赋值的区别 单独仿真小模块对但将小模块加入整个工程仿真不对就有可能是没有注意到仿真中阻塞赋值和非阻塞赋值的区别 目录 前言 一、简介 二、设计实例 三、仿真实例 1、仿真用非阻塞赋值 2、仿真用阻塞赋值 总结 前言 网上很多人介绍verilo…...

LabVIEW轴角编码器自动检测

LabVIEW 开发轴角编码器自动检测系统&#xff0c;针对指控系统中高故障率的轴角编码器性能检测需求&#xff0c;通过模块化硬件架构与软件设计&#xff0c;实现编码器运转状态模拟、扭矩 / 转速实时监测、19 位并行编码采集译码、数据自动分析及报告生成等功能&#xff0c;解决…...

MySQL数据库从0到1

目录 数据库概述 基本命令 查询命令 函数 表的操作 增删改数据和表结构 约束 事务 索引 视图 触发器 存储过程和函数 三范式 数据库概述 SQL语句的分类&#xff1a; DQL&#xff1a;查询语句&#xff0c;凡是select语句都是DQL。 DML&#xff1a;insert,delete,up…...

WiFi万能钥匙鲲鹏服务器部署 TiDB 集群实战指南

作者&#xff1a; TiDBer_yangxi 原文来源&#xff1a; https://tidb.net/blog/15a234d0 一、环境准备 1. 硬件要求 服务器架构 &#xff1a;鲲鹏服务器&#xff08;ARM架构&#xff09;&#xff0c;TiDB 官方明确支持 ARM 架构服务器部署 推荐配置 &#xff08;生产环…...

正则表达式的前世今生

当你熟练地用正则表达式查找替换代码时&#xff0c;这个工具的历史可以追溯到1943年。那时候还没有计算机&#xff0c;更别说编程语言了。 从神经网络到文本匹配 故事要从两个神经生理学家说起。1943年&#xff0c;Warren McCulloch和Walter Pitts发表了一篇论文《A logical ca…...

Vue 核心技术与实战智慧商城项目Day08-10

温馨提示&#xff1a;这个黑马的视频在b占可以找到&#xff0c;里面有完整的教学过程 然后这个项目有完整的代码&#xff0c;我已经上传了&#xff0c;如果审核成功大家就可以看了&#xff0c;但是需要审核多久我也不是很确定 1.项目演示 2. 项目收获 3. 创建项目 4. 调整初始化…...

TCP/IP协议精华总结pdf分享

hi &#xff0c;大家好&#xff0c;应小伙伴们的要求&#xff0c;上次分享了个人的一些学习和职场经验&#xff0c;其中网络协议PDF文档是我之前学习协议的时候总结一些精华知识&#xff0c;网络属于基本功&#xff0c;是互联网必备知识&#xff0c;我深信掌握好核心20%知识&am…...

组件化:软件工程化的基础

在现代软件系统中&#xff0c;**组件化&#xff08;Componentization&#xff09;**不仅是一种设计技术&#xff0c;更是推动软件工程走向工业化、体系化的关键基础。随着业务复杂度、团队规模与生命周期成本的持续上升&#xff0c;软件开发从“写代码”演变为“构建系统”。而…...

⚡️ Linux grep 命令参数详解

⚡️ Linux grep 用法及参数详解 &#x1f4d8; 1. grep 简介 grep 是 Linux/Unix 系统中用于文本搜索的命令&#xff0c;其全称为 Global Regular Expression Print&#xff0c;意为全局正则表达式打印器。 它根据给定的 模式&#xff08;pattern&#xff09; 对文件或标准…...

2025年第三届CCF·夜莺开源创新论坛通知

点击蓝字 关注我们 CCF Opensource Development Committee 01 大会简介 由中国计算机学会主办、CCF开源发展委员会及夜莺开源社区承办的第三届CCF夜莺开源创新论坛拟于2025年7月4日在北京召开。本次论坛以“AI 加速可观测”为主题&#xff0c;汇聚了开源夜莺核心开发团队&#…...

GMDCMonitor企业版功能分享0602

企业版包含了拓扑中心、签退中心、知识库、通知渠道配置、平台自定义&#xff0c;这5个功能 1&#xff09;拓扑中心 拓扑中心绘制的时候需要注意2点&#xff1a; 1&#xff09;要先选择 “矩形区域” 或 “圆形区域” 来添加各个背景区域&#xff0c;同时录入区域尺寸&#x…...

automa

网页版插件 https://extension.automa.site/(可能插件下架了&#xff09; https://github.com/AutomaApp/automa/releases/tag/v1.29.9&#xff08;可以直接在git上下载&#xff09; automa官网地址&#xff1a; https://www.automa.site/ 官方的文档 https://docs.automa.si…...

Warm-Flow发布1.7.3 端午节(设计器流和流程图大升级)

Warm-Flow发布1.7.3 端午节&#xff08;设计器流和流程图大升级&#xff09; 更新内容项目介绍功能思维导图演示地址官网Warm-Flow视频 更新内容 [feat] 新版流程图通过前端渲染[perf] 美化流程设计器ui[feat] 办理人权限处理器&#xff0c;新增办理人转换接口&#xff0c;比如…...

【存储基础】SAN存储基础知识

文章目录 1. 什么是SAN存储&#xff1f;2. SAN存储组网架构3. SAN存储的主要协议SCSI光纤通道&#xff08;FC&#xff09;协议iSCSIFCoENVMe-oFIB 4. SAN存储的关键技术Thin Provision&#xff1a;LUN空间按需分配Tier&#xff1a;分级存储Cache&#xff1a;缓存机制QoS&#x…...

2025年ESWA SCI1区TOP,改进成吉思汗鲨鱼算法MGKSO+肝癌疾病预测,深度解析+性能实测

1.摘要 本文针对肝癌&#xff08;HCC&#xff09;早期诊断难题&#xff0c;提出了一种基于改进成吉思汗鲨鱼优化算法&#xff08;MGKSO&#xff09;的计算机辅助诊断系统。由于HCC在早期症状不明显且涉及高维复杂数据&#xff0c;传统机器学习方法易受噪声和冗余特征干扰。为提…...

精益数据分析(93/126):增长率的真相——从数据基准到科学增长策略

精益数据分析&#xff08;93/126&#xff09;&#xff1a;增长率的真相——从数据基准到科学增长策略 在创业领域&#xff0c;增长率常被视为企业成功的核心指标&#xff0c;但多少才算“足够好”&#xff1f;如何避免陷入“盲目增长陷阱”&#xff1f;今天&#xff0c;我们将…...

MAC上怎么进入隐藏目录

在Mac上&#xff0c;由于系统保护的原因&#xff0c;一些系统目录如/usr默认是隐藏的&#xff0c;但可以通过以下方法进入&#xff1a; 方法一&#xff1a;使用Finder的“前往文件夹”功能 打开Finder。使用快捷键Command Shift G&#xff0c;或者在菜单栏中选择“前往”-“…...

Spark-TTS: AI语音合成的“变声大师“

嘿&#xff0c;各位AI爱好者&#xff01;还记得那些机器人般毫无感情的合成语音吗&#xff1f;或者那些只能完全模仿但无法创造的语音克隆&#xff1f;今天我要介绍的Spark-TTS模型&#xff0c;可能会让这些问题成为历史。想象一下&#xff0c;你可以让AI不仅说出任何文字&…...

【Python 进阶3】常见的 call 和 forward 区别

在 Python 和深度学习框架&#xff08;如 PyTorch&#xff09;中&#xff0c;__call__ 和 forward 是两个不同的概念&#xff0c;它们的用途和实现方式有明显区别&#xff1a; 1. __call__ 方法&#xff08;Python 内置特殊方法&#xff09; 在 Python 中&#xff0c;__call_…...

WEB3——简易NFT铸造平台之nft.storage

该平台目前已经不太支持免费试用&#xff0c;现在推荐Pinata平台&#xff0c;免费用1GB Pinata | Cryptos file storage 下面web3.storage也可以用&#xff0c;但是需要你有可以交易的外币卡 w3up console &#x1f9e0; 1. nft.storage 是什么&#xff1f; https://nft.stor…...

一元函数积分

1. 不同名函数积分 2.三角函数有理式...

6年“豹变”,vivo S30系列引领手机进入场景“体验定义”时代

出品 | 何玺 排版 | 叶媛 5月29日晚&#xff0c;备受用户期待的vivo S30系列如约而至。 相比前几代S系列产品&#xff0c;S30系列变化显著&#xff0c;堪称“豹变”。首先&#xff0c;其产品打造思路发生了质变&#xff0c;产品体验更好&#xff0c;综合竞争力更为强。其次&a…...

Pytorch的梯度控制

在之前的实验中遇到一些问题&#xff0c;因为之前计算资源有限&#xff0c;我就想着微调其中一部分参数做&#xff0c;于是我误打误撞使用了with torch.no_grad&#xff0c;可是发现梯度传递不了&#xff0c;于是写下此文来记录梯度控制的两个方法与区别。 在PyTorch中&#x…...

linux驱动开发(1)-内核模块

内核模块 模块最大的好处是可以动态扩展应用程序的功能而无须重新编译链接生成新的应用程序镜像&#xff0c;在微软的Windows系统上动态链接库DLL&#xff08;Dynamic Link Library&#xff09;&#xff0c;Linux系统上的共享库so&#xff08;shared object&#xff09;文件的…...

AI产品风向标:从「工具属性」到「认知引擎」的架构跃迁​

近年来&#xff0c;人工智能正在改变法律行业的游戏规则。从最初的“工具属性”——帮律师干些重复的杂活儿&#xff0c;到如今逐渐变身为“认知引擎”——能够理解法律逻辑、分析案例&#xff0c;法律AI产品正在迎来一场华丽的转身。这篇文章将带你一探究竟&#xff0c;看看这…...

前端八股之CSS

CSS 盒子模型深度解析与实战 一、盒子模型核心概念 Box-sizing CSS 中的 box-sizing 属性定义了引擎应该如何计算一个元素的总宽度和总高度 语法&#xff1a; box-sizing: content-box|border-box|inherit:content-box 默认值&#xff0c;元素的 width/height 不包含paddi…...

ps自然饱和度调整

在Photoshop&#xff08;PS&#xff09;中&#xff0c;自然饱和度调整是一项用于优化图像色彩的重要功能&#xff0c;以下是对其详细解析&#xff1a; 一、功能概述 自然饱和度主要针对画面中饱和度较低的像素进行着重调整&#xff0c;同时对高饱和度区域限制较小&#xff0c…...