C++ 指针函数和函数指针
除了void类型的函数之外,函数在调用结束之后都要有返回值,指针也可以是函数的返回值。当一个函数的返回值是指针类型时,这个函数就是指针型函数。 使用指针型函数的最主要目的就是要在函数结束时把大量的数据从被调函数返回到主调函数中。而通常非指针型函数调用结束后,只能返回一个变量或对象。
1.指针函数
除了void类型的函数之外,函数在调用结束之后都要有返回值,指针也可以是函数的返回值。当一个函数的返回值是指针类型时,这个函数就是指针型函数。 使用指针型函数的最主要目的就是要在函数结束时把大量的数据从被调函数返回到主调函数中。而通常非指针型函数调用结束后,只能返回一个变量或对象。
指针函数的一般定义形式是:
数据类型 *函数名(参数表)
{函数体
}
数据类型表明函数返回指针的类型;函数名和“*”标识了一个指针型函数;参数表中是函数的形参列表。
【例】
int* fun(int size)
{int* arr = (int*)malloc(size*sizeof(int));return arr;
}int main()
{int* p = fun(5);if (*p != NULL){for (int i = 0; i < 5; i++){p[i] = i + 1;cout << p[i] <<" ";}cout << endl;}free(p);return 0;
}
运行结果:

2.函数指针
在程序运行时,不仅数据要占据内存空间,执行程序的代码也被调入内存空间并占据一定的空间。**每一个函数都有函数名,实际上这个函数名就表示函数的代码在内存中的起始地址。**由此看来,调用函数的通常形式“函数名(参数表)”的实质就是“函数代码首地址(参数表)”。
函数指针就是专门用来存放函数代码首地址的变量。 在程序中可以像使用函数名一样使用指向函数的指针来调用函数。也就是说一旦函数指针指向了某个函数,它与函数名便具有同样的作用。函数名在表示函数代码起始地址的同时,也包括函数的返回值类型和参数的个数、类型、排列次序等信息。因此在通过函数名调用函数时,编译系统能够自动检查实参与形参是否相符,用函数的返回值参与其他运算时,能自动进行类型一致性检查。
(1)声明一个函数指针
声明一个函数指针时,也需要说明函数的返回值、形参列表,其一般语法如下:
数据类型 (*函数指针名)(形参表)
数据类型说明函数指针所指函数的返回值类型;第一个圆括号中的内容指明一个函数指针的名称;形参表则列出了该指针所指函数的形参类型和个数。
【注意】 由于对函数指针的定义在形式上比较复杂,如果在程序中出现多个这样的定义,多次重复这样的定义会相当繁琐,一个很好的解决办法就是typedef。
例如:
typedef int(*fun)(double);
这声明了fun为“有一个double形参、返回类型为int的函数的指针”类型的别名。下面,需要声明这一类型的变量时,可以直接使用:
fun funprt;
这声明了一个具有该类型的名称为funptr的函数指针。用typedef可以方便地为复杂类型起别名。
(2)函数指针的使用
函数指针在使用之前也要进行赋值,是指针指向一个已经存在的函数代码的起始地址。一般语法为:
函数指针名=函数名;
等号右边的函数名所指出的必须是一个已经声明过的、和函数指针具有相同的返回类型和相同形参表的函数。在赋值之后,就可以通过函数指针名来直接引用这个指针指向的函数。
【例】函数指针实例
void A(float)
{cout << "这是一个A函数" << endl;
}void B(float b)
{cout << "b的值为:" << b << endl;
}void C(float c)
{cout << "c的值为:" << c << endl;
}const float PI = 3.14159f;
const float TOW_PI = PI * 2.0f;int main()
{void (*fun)(float);//函数指针A(PI);fun = A;//函数指针指向Afun(PI);//函数指针调用fun = B;//函数指针指向Bfun(TOW_PI);//函数在指针调用fun(13.0);//函数指针调用fun = C;//函数指针指向CC(PI);//函数指针调用return 0;
}
运行结果:

上例程序中声明了一个void类型的函数指针:
void (*fun)(float);//void类型的函数指针
在主函数运行过程中,通过赋值语句使这个指针分别指向函数A,B和C,然后通过函数指针来实现对函数的调用。
相关文章:
C++ 指针函数和函数指针
除了void类型的函数之外,函数在调用结束之后都要有返回值,指针也可以是函数的返回值。当一个函数的返回值是指针类型时,这个函数就是指针型函数。 使用指针型函数的最主要目的就是要在函数结束时把大量的数据从被调函数返回到主调函数中。而通…...
JAVA实现存在更新不存在插入与及多余的进行删除(三)
这个版本,主要是迭代重载了下save方法,不废话,直接上代码: /*** 保存数据,处理数据的增删改** param paramData 前台的参数* param dbData 后台的数据* param clazz 前后台参数对应的class* param beanName …...
iMX6ULL驱动开发 | OLED显示屏SPI驱动实现(SH1106,ssd1306)
周日业余时间太无聊,又不喜欢玩游戏,大家的兴趣爱好都是啥?我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏,一直在吃灰,何不把玩一把?于是说干就干,最后在我的imax6ul的lin…...
拥抱创新:用Kotlin开发高效Android应用
拥抱创新:用Kotlin开发高效Android应用 引言 在当今数字时代,移动应用已经成为人们生活中不可或缺的一部分。无论是社交媒体、电子商务还是健康管理,移动应用已经深刻地影响了我们的生活方式。随着移动设备的普及和功能的增强,A…...
Effective Java笔记(20)接口优于抽象类
Java提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从Java 8为继承引入了缺省方法( default method),这两种机制都允许为某些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,类必须成…...
react学习笔记——1. hello react
包含的包一共有4个,分别的作用如下: babel.min.js:可以进行ES6到ES5的语法转换;可以用于import;可以用于将jsx转换为js。注意,在开发的时候,这个转换(jsx转换js)不在线上…...
明明已经安装字体,但IDEA、CLION无法找到思源黑体/Source Hans Sans的问题解决
IDEA、CLION的Jetbrain系列软件不支持非TrueType的中文字体,而Adobe官方给出的字体却不是TrueType的,所以便会导致Jetbrain系软件无法找到已安装的中文字体,因此我们需要安装TrueType的字体 请在以下Github链接中下载: TrueType思…...
2023-08-03力扣今日四题
链接: 剑指 Offer 67. 把字符串转换成整数 题意: 按规则将字符串转换成整数,规则不详叙 解: 字符串处理 实际代码: #include<iostream> #include<cstring> #include<climits> using namespac…...
【学会动态规划】最佳买卖股票时机含冷冻期(15)
目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...
随机RSI震荡指标公式(StochRSI),RSI和KDJ二合一
随机RSI震荡指标(StochRSI)是由图莎尔钱德和斯坦利克罗发明的一种摆动指标,结合了相对强弱指标(RSI)和随机指标(KDJ)的原理,目的是提高灵敏度,解决RSI难以达到超买超卖区的问题,以便…...
轻松搭建酒店小程序
酒店小程序的制作并不需要编程经验,只需要按照以下步骤进行操作,就能很快地搭建自己的小程序商城。 第一步,注册登录账号进入操作后台,找到并点击【商城】中的【去管理】进入商城的后台管理页面,然后再点击【小程序商城…...
算法通过村——Hash和队列问题解析
算法的备胎Hash和找靠山的队列 备胎Hash Hash,不管是算法,还是在工程中都会大量使用。很多复杂的算法问题都用Hash能够轻松解决,也正是如此,在算法例就显得没什么思维含量,所以Hash是应用里的扛把子,但在算…...
租赁类小程序定制开发|租赁管理系统源码|免押租赁系统开发
随着互联网的发展,小程序成为了一种重要的移动应用开发方式。租赁小程序作为其中的一种类型,可以为很多行业提供便利和创新。下面我们将介绍一些适合开发租赁小程序的行业。 房屋租赁行业:租房小程序可以帮助房东和租户快速找到合适的租赁…...
后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…...
Mac 安装不在 Apple 商店授权的应用程序
文章目录 一、场景介绍二、实操说明 一、场景介绍 在日常的工作生活中,发现一些好用的应用程序,但是出于某些原因,应用程序的开发者并没有将安装包上架到苹果商店。 那么这些优秀的应用程序下载安装以后就会出现如下弹框被拒之门外 二、实操…...
【MyBatis】MyBatis把空字符串转换成0的问题处理方案(96)
先看问题: Postman入参: MyBatis采用map循环插入: // Mapper接口层void addPar(Param(value "question") Map<String, Object> paramMap);<!-- 新增:参数 --><insert id"addPar" parameterType"map">INSERT IGNO…...
OpenLayers实战,OpenLayers获取移动端精确定位,OpenLayers适配App混合H5方式调用手机定位位置并定位到指定点
专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解OpenLayers如何获取移动端精确定位位置。不使用任何native本地方法,只使用纯js实现。 本篇文章适用于App混合H5方式调用手机精确定位,打包时需要选择GPS位置权限,手机获取定位过程中会弹出是否允许定位的权限提示。 …...
Go指针取址问题:循环后每次都拿到相同内容
例子: func main() {yourList : [...]int{1, 2, 3}yourMap1 : make(map[int]*int)yourMap2 : make(map[int]*int)for key, value : range yourList {// 修改前yourMap1[key] &value// 修改后tmp : valueyourMap2[key] &tmpfmt.Println(value, &value…...
用Rust实现23种设计模式之简单工厂
在 Rust 中,可以使用结构体和 trait 来实现工厂方法模式。工厂方法模式是一种创建型设计模式,通过定义一个创建对象的接口,让子类决定实例化哪个类。下面是一个简单的示例,展示了如何使用 Rust 实现工厂方法模式: // …...
SpringBoot + minio实现分片上传、秒传、续传
什么是minio MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议,项目地址是https://github.com/minio/minio。 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容…...
如何免费打造你的个人游戏串流服务器:Sunshine终极指南 [特殊字符]
如何免费打造你的个人游戏串流服务器:Sunshine终极指南 🎮 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC大作,却不想被…...
5个SRWE窗口分辨率控制技巧:突破游戏与应用限制的终极方案
5个SRWE窗口分辨率控制技巧:突破游戏与应用限制的终极方案 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE Simple Runtime Window Editor(SRWE)是一款革命性的窗口分辨率控制…...
从开源硬件到空间AI:深度解析OAK(OpenCV AI Kit)的架构与核心优势
1. OAK的前世今生:从自行车安全到空间AI革命 第一次听说OAK(OpenCV AI Kit)是在2021年的一个机器人开发者社区里,当时有个做智能仓储的朋友兴奋地告诉我:"这玩意儿把双目视觉、AI推理和视频编码全塞进了一个火柴盒…...
PvZ Toolkit:植物大战僵尸PC版终极修改工具完全指南
PvZ Toolkit:植物大战僵尸PC版终极修改工具完全指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PvZ Toolkit是一款专为植物大战僵尸一代PC版设计的开源综合修改工具,为玩…...
GHelper:轻量级ROG笔记本性能优化工具,告别臃肿的官方控制软件
GHelper:轻量级ROG笔记本性能优化工具,告别臃肿的官方控制软件 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, F…...
OpCore-Simplify终极指南:如何10分钟完成黑苹果EFI配置
OpCore-Simplify终极指南:如何10分钟完成黑苹果EFI配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCore配置而头痛吗…...
别让AI代码,变成明天的技术债残
如果有多个供应商,你也可以使用 [[CC-Switch]] 来可视化管理这些API key,以及claude code 的skills。 # 多平台安装指令 curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/i…...
【限时解禁】某自动驾驶大模型在线学习模块源码片段(含动态LoRA路由+时间敏感缓存淘汰算法)
第一章:大模型工程化中的在线学习机制 2026奇点智能技术大会(https://ml-summit.org) 在线学习机制是大模型从静态部署走向动态演化的关键桥梁,它使模型能在生产环境中持续吸收新数据、响应分布偏移,并在不中断服务的前提下完成参数更新。与…...
基于Simulink的超外差单边带接收机建模与动态仿真分析
1. 超外差单边带接收机基础原理 第一次接触超外差接收机时,我被它的"变频"概念搞得一头雾水——为什么要把信号变来变去?后来在调试收音机电路时才恍然大悟:这就好比把不同尺寸的快递包裹统一放到标准传送带上处理。具体来说&#…...
用DDRNet-23-slim在RTX 3060笔记本上搞定细胞图像分割:从数据标注到模型测试的完整避坑记录
在RTX 3060笔记本上实现细胞图像分割:DDRNet-23-slim实战全流程解析 当我在生物实验室第一次看到显微镜下的细胞图像时,立刻被那些复杂的结构吸引了。作为一名刚接触医学图像处理的研究生,我迫切希望能用AI技术自动识别不同类型的细胞。但实验…...
