C++ 函数指针探幽

news2024/9/24 13:25:59

首先看下面两个声明代表什么意思?

double* (*(*pf)[2])(double*,int);
double* (*pa[2])(double*,int);

要搞清楚这两个式子,则先要清楚

  1. 指向指针的指针
  2. 指针数组与指向数组的指针
  3. 函数指针

指向指针的指针

在这里插入图片描述
指针的指针特殊点在于指向的是一个指针而已,解引用它得到指向的指针的地址,再解引用便可得到变量的值

int i = 10;
int *p = &i;
int **pp = &p;
std::cout<<pp<<" "<<*pp<<" "<<**pp<<std::endl;

输出:
0000001E45AFF8D8 0000001E45AFF8B4 10

指针数组与指向数组的指针

指针数组表示数组里面的每一个元素都是一个指针;而指向数组的指针表示它指向一个数组的首地址

太绕,具体说明下

//我声明的数组
int arr[2][2] = {{1,2},{3,4}};
//指针数组,[] 比 * 优先级高,这是一个含有两个元素的数组,并且这两个元素都是指针
int *p[2] = {arr[0],arr[1]}; // 这两个指针分别指向arr数字第一行和第二行首地址,也可以指向其他数组的地址
//可以当数组用了
std::cout<<p[0][0]<<" "<<p[1][0]<<std::endl; 

//指向数组的指针
int (*pr)[2] = arr;
std::cout<<pr[0][0]<<" "<<pr[1][0]<<std::endl;
//等效
std::cout<<(*pr)[0]<<" "<<(*(pr+1))[0]<<std::endl;

一定要注意里面的区别
在这里插入图片描述

函数指针

顾明思义,这个指针指向函数,声明和指向的函数必须相同的参数和返回值

//这是函数声明
double* fun(double* dis, int price);
//函数指针,参数名可省略
double* (*pfun)(double*, int);

到此,我们先回头看

double* (*pa[2])(double*,int);

明显,这是一个包含两个函数指针的数组,指向的函数原型为

double* fun(double* dis, int price);

so, 我们可以让这两个指针分别指向两个不同的函数;

//用 typedef 修饰,则可以直接用pa声明此类指针数组
typedef double* (*pa[2])(double*,int);

double* f1(double* discount, int price)
{
    std::cout<< "f1(): "<< price*(*discount) << std::endl;
    return 0;
}

double* f2(double* discount, int price)
{
    std::cout<< "f2(): "<< price*(1.0 - *discount) << std::endl;
    return 0;
}
pa p = {f1,f2};
double dis = 0.6;
(*p)(&dis,10);
//p[0](&dis,10);
//(*(p+1))(&dis,10);
p[1](&dis,10);

继续

double* (*(*pf)[2])(double*,int);

(pf)[2] 表示这是一个指向包含2个元素的数组的指针,而 ((*pf)[2]) 则表示指向 (pf)[2] 的指针,指针又是一个返回值为 double 的函数指针。

举例来看

typedef double* (*(*pf)[2])(double*,int);
// 接上面的例子,p 的pa类型的函数指针,p1 是指向 p 的指针
pf p1 = &p;
// 解引用 p1 就得到的指向的指针地址(p的地址)
(*p1)[0](&dis,10);
//(*p1)[1](&dis,10);
(*((*p1)+1))(&dis,10);
//错误,你明白为什么了吗?
//(*(*(p1+1)))(&dis,10);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈与队列2:用队列实现栈

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;344. 反转字符串 题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#x…

计量经济学复习

计量经济学 习题&#xff08;史浩江版&#xff09; 习题一 一. 单项选择题 1、横截面数据是指&#xff08;A&#xff09;。 A 同一时点上不同统计单位相同统计指标组成的数据 B 同一时点上相同统计单位相同统计指标组成的数据 C 同一时点上相同统计单位不同统计指标组成的…

GPT-Chinese 复现

github 环境准备 conda -create gpt_cn python3.7 conda activate gpt_cnconda install pytorch1.10.0 torchvision0.11.0 torchaudio0.10.0 -c pytorch pip install -r requirements.txt错误 module distutils has no attribute version解决方案&#xff1a; pip uninstal…

[附源码]计算机毕业设计基于Springboot游戏交易平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MinIO实战

1.简介 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。 2.部署 2.1单机器单节点&#xff08;docker&#xff09; 官网教程&#xff1a;https://min.io/docs/minio/container/index.html mkdir -p ~/minio/dat…

Node.js编程

Node.js编程 一、实验目的与要求 实验任务 用户信息增删改查 掌握数据库软件的安装了解集合、文档的概念掌握使用mongoose创建集合的方法创建集合掌握对数据库中的数据进行增删改查操作 二、实验任务和步骤 实验1. 用户信息增删改查 需求说明 (1)搭建网站服务器&#xf…

第十章 降维与度量学习

10.1 k近邻学习 k近邻学习&#xff08;kNN&#xff09;是一种常用的监督学习方法&#xff0c;其工作机制非常简单&#xff1a;给定测试样本&#xff0c;基于某种距离度量找出训练集中与其最靠近的k个训练样本&#xff0c;然后基于这k个邻居的信息来进行预测。 k近邻学习似乎与…

2022 计网复习计算题【太原理工大学】

期末复习汇总&#xff0c;点这里&#xff01;https://blog.csdn.net/m0_52861684/category_12095266.html?spm1001.2014.3001.5482 三、计算题 1. 假定 1km 长的 CSMA/CD 网络的数据率为 1Gb/s&#xff0c;设信号在网络上的传播速率为 200000km/s。求能够使用此协议的最短帧长…

java swing(GUI) MySQL实现的学生选课成绩管理系统源码+运行教程

今天给大家演示一下由Java swing mysql实现的一款学生选课成绩信息管理系统&#xff0c;主要实现的功能有&#xff1a;学生教师信息管理、年级班级信息管理、课程信息管理、选课、成绩录入功能、成绩统计功能&#xff0c;实现学生、教师、管理员三个角色的登录&#xff0c;三个…

【计算机图形学入门】笔记1:图形学概述

前言&#xff1a;今天开始开启一个新篇章的学习&#xff0c;那就是games101闫令琪老师讲的《现代计算机图形学入门》课程&#xff0c;我会根据闫老师每节课讲的内容记录重点笔记&#xff0c;每节课都会整理一篇发布出来&#xff0c;希望自己可以坚持下去&#xff0c;从图形学小…

可视化音视频分析工具:好用工具大集锦,快转发给你兄弟看看丨音视频工具

&#xff08;本文基本逻辑&#xff1a;音画原始数据分析工具介绍 → 编码数据分析工具介绍 → 封装格式分析工具介绍&#xff09; 工欲善其事&#xff0c;必先利其器。在音视频开发中&#xff0c;为了方便、快捷、直观的分析音视频数据&#xff0c;最好能有一些可视化的分析工…

《爱在 ZStack Cube 超融合》三部曲

一、始于初识&#xff1a;很高兴见到你 这一天东川路最靓的仔打开了 ZStack Cube 宝盒 &#xff0c;这可能是我们的第一次相遇&#xff0c;我们相谈甚欢&#xff0c;相遇恨晚。 我的名字是 ZStack Cube&#xff0c;一个基于超融合架构的云平台。我拥有3300、5300、7300、7300…

Acwing_98

题目链接 考察知识点&#xff1a; 坐标变换、递归、分治。 核心问题&#xff1a;计算出点的坐标。 策略是递归算出子图形中的坐标&#xff0c;再进行平移得到当前图形中的坐标。 采用下图方式建立坐标系&#xff1a;原点在中心。 前置知识&#xff1a; (x,y)(x,y)(x,y) 逆时…

ResNet18实现——MNIST手写数字识别(突破0.995)

1.简单CNN改进 简单的CNN实现——MNIST手写数字识别 该部分首先对我前面的工作进行了改进&#xff0c;然后以此为基础构建ResNet18去实现MNIST手写数字识别。 1.改进要点&#xff1a; 1.利用nn.Sequential&#xff08;&#xff09;自定义块结构&#xff0c;增加可读性和方便…

Spring - 什么是spring?

好久没更新博客了&#xff0c;今天小更一波。 学习java已经有一段时间了&#xff0c;今天将接触Spring框架技术。 什么是Spring? spring 中文意思就是 春天&#xff0c;实际上spring 是真的给软件行业带来了春天。 使用spring的好处&#xff1f; spring可以解决企业级开发…

眼内衍射透镜的设计与分析

1. 摘要 如今&#xff0c;多焦点眼内透镜移植已广泛用于白内障的治疗。作为其优势特点之一&#xff0c;衍射眼内透镜为病患提供了很好的远近景性能。这种透镜经常在Zemax OpticStudio 中采用binary2面型进行设计。在本示例中&#xff0c;我们阐述了如何将初始设计导入VirtualLa…

嵌入式开发--RS-485通讯的问题

嵌入式开发 RS-485通讯的问题RS-485说明接口芯片硬件连接CubeMX设置代码编写引脚定义使能串口中断函数发送数据接收数据有一个问题&#xff0c;多收了一个数数据线上的波形问题分析问题解决RS-485说明 RS-485一般简称485总线&#xff0c;是最常用的工业总线之一&#xff0c;一…

LeetCode简单题之回环句

题目 句子 是由单个空格分隔的一组单词&#xff0c;且不含前导或尾随空格。 例如&#xff0c;“Hello World”、“HELLO”、“hello world hello world” 都是符合要求的句子。 单词 仅 由大写和小写英文字母组成。且大写和小写字母会视作不同字符。 如果句子满足下述全部条…

从 0 开始学习 Git + GitHub

文章目录一、GitHub创建仓库二、安装Git客户端1、安装2、配置身份三、为Github账户设置SSH key1、生成ssh key2、GitHub 新建SSh key3、测试连接是否成功四、上传本地项目到Github方法一&#xff1a;方法二&#xff1a;master分支到main分支迁移五、Git常用命令git initgit sta…

共享主机安全吗(以及如何保护它)?

共享主机是在一台服务器上存储多个网站的主机。通常&#xff0c;您的资源(例如 CPU、内存、数据库和带宽)会在用户之间溢出。由于它非常适合流量低的网站&#xff0c;且因具成本效益&#xff0c;共享主机相当普遍。如果您是博主和小型企业&#xff0c;则很有可能会选择共享主机…