指针(三)

函数指针

定义:整型指针是指向整形的指针,数组指针式指向数组的指针,其实函数指针就是指向函数的指针。
函数指针基础:

  1. ()优先级要高于*;
  2. 一个变量除去了变量名,便是它的变量类型;
  3. 一个指针变量除去了变量名和*,便是指针指向内容的类型。
#include<stdio.h>
int Add(int x, int y)
{return x + y;
}
int main()
{int(*p)(int, int) = &Add;//取出函数的地址放在函数指针p中return 0;
}

函数指针:

int (*p) (int , int) 

函数指针的使用

  1. 函数指针的赋值
    对于数组来说,数组名和&数组名它们代表的意义不同,数组名代表的是数组首元素地址,而&数组名代表的是整个数组的地址。
    但是对于函数来说,函数名和&函数名它们代表的意义却是相同的,它们都代表函数的地址(毕竟你也没有听说过函数有首元素这个说法吧)。
    所以,当我们对函数指针赋值时可以赋值为&函数名,也可以赋值为函数名。
	int(*p)(int, int) = &Add;int(*p)(int, int) = Add;
  1. 通过函数指针调用函数
    方法一:我们知道,函数指针存放的是函数的地址,那么我们将函数指针进行解引用操作,便能找到该函数了,于是就可以通过函数指针调用该函数。
#include<stdio.h>
int Add(int x, int y)
{return x + y;
}
int main()
{int a = 10;int b = 20;int(*p)(int, int) = &Add;int ret = (*p)(a, b);       //解引用找到该函数    printf("%d\n", ret);return 0;
}

方法二:直接 (*p)(a, b)

int *p;
p =Add;
int ret = p(a,b) ;

函数指针数组

数组是一个存放相同类型数据的空间,我们已经认识了指针数组,比如:

	int* arr[10];//数组arr有10个元素,每个元素的类型是int*

那如果要将一系列相同类型的函数指针存放到一个数组中,那么这个数组就叫做函数指针数组,比如:

	int(*pArr[10])(int, int);//数组pArr有10个元素,每个元素的类型是int(*)(int,int)

函数指针数组的创建只需在函数指针创建的基础上加上[ ]即可。
比如,你要创建一个函数指针数组,这个数组中存放的函数指针的类型均为int(*)(int,int),如果你要创建一个函数指针为该类型,那么该函数指针的写法为int(*p)(int,int),现在你要创建一个存放该指针类型的数组,只需在变量名的后面加上[ ]即可,int(*pArr[10])(int,int)。
函数指针数组的使用-模拟计算器
函数指针数组一个很好的运用场景,就是计算机的模拟实现:

#include<stdio.h>
void menu()
{printf("|-----------------------|\n");printf("|     1.Add   2.Sub     |\n");printf("|     3.Mul   4.Div     |\n");printf("|        0.exit         |\n");printf("|-----------------------|\n");
}//菜单
double Add(double x, double y)
{return x + y;
}//加法函数
double Sub(double x, double y)
{return x - y;
}//减法函数
double Mul(double x, double y)
{return x*y;
}//乘法函数
double Div(double x, double y)
{return x / y;
}//除法函数
int main()
{int input = 0;double x = 0;//第一个操作数double y = 0;//第二个操作数double ret = 0;//运算结果double(*pArr[])(double, double) = { 0, Add, Sub, Mul, Div };//函数指针数组-转移表int sz = sizeof(pArr) / sizeof(pArr[0]);//计算数组的大小do{menu();printf("请输入:>");scanf("%d", &input);if (input == 0)printf("退出程序\n");else if (input > 0 && input < sz){printf("请输入两个操作数:>");scanf("%lf %lf", &x, &y);ret = pArr[input](x, y);printf("ret=%lf\n", ret);}elseprintf("选择错误,请重新选择!\n");} while (input);//当input不为0时循环继续return 0;
}

代码中,函数指针数组存放的是一系列参数和返回类型相同的函数名,即函数指针。将0放在该函数指针数组的第一位是为了让用户输入的数字input与对应的函数指针下标相对应。
该代码若不使用函数指针数组,而选择使用一系列的switch分支语句当然也能达到想要的效果,但会使代码出现许多重复内容,而且当以后需要增加该计算机功能时又需要增加一个case语句,而使用函数指针数组,当你想要增加计算机功能时只需在数组中加入一个函数名即可。

指向函数指针数组的指针

既然存在函数指针数组,那么必然存在指向函数指针数组的指针。

	int(*p)(int, int);//函数指针int(*pArr[5])(int, int);//函数指针数组int(*(*pa)[5])(int, int) = &pArr;//指向函数指针数组的指针

那指向函数指针数组的指针的类型是如何写的呢?

在这里插入图片描述

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

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

相关文章

两种伦敦银缺口 如何为我们的交易服务?

我们做伦敦银也会碰到缺口&#xff0c;有的朋友会说伦敦银不是24小时交易的品种吗&#xff1f;怎么有缺口呢&#xff1f;虽说伦敦银是24小时交易的品种&#xff0c;但是在北京时间的凌晨也会停止交易一段时间&#xff0c;这是平台结算时间。在亚盘早段伦敦银重新开盘之后&#…

Android的前台服务

概述 前台服务是用户主动意识到的一种服务&#xff0c;因此在内存不足时&#xff0c;系统也不会考虑将其终止。前台服务必须为状态栏提供通知&#xff0c;将其放在运行中的标题下方。这意味着除非将服务停止或从前台移除&#xff0c;否则不能清除该通知。 在 Android 8.0&…

Vue3自定义Hooks定义

在Vue3中&#xff0c;自定义Hooks的定义是通过创建一个函数来共享逻辑或状态&#xff0c;以便在多个组件之间重复使用。Vue3中的自定义Hooks与React中的自定义Hooks非常相似&#xff0c;但有一些细微的差别。 要定义一个自定义Hook&#xff0c;可以按照以下步骤进行操作&#x…

一对一聊天

1.创建包 .服务界面 package yiduiy;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.uti…

1.2 C语言简介

一、为什么要讲C语言 C语言是编程界的长青藤&#xff0c;可以查看语言排名发现&#xff0c;虽然现在语言很多&#xff0c;但是C语言一直占有一定地址 来源网站&#xff1a;https://www.tiobe.com/tiobe-index/ 在系统、嵌入式、底层驱动等领域存在一定的唯一性&#xff08;C语…

pytorch学习10-网络模型的保存和加载

系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换&#xff08;ReLU和sigmoid&#xff09;pytorc…

HTML总结

HTML简介 HTML(Hyper Text Markup Language)的全称为超文本标记语言&#xff0c;是一种标记语言。它包括一系列标签&#xff0c;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本&#xff0c…

C++模板背后的黑箱操作:编译器

C模板背后的黑箱操作:编译器 编译器如何处理模板 模板代码的处理 为了理解模板的复杂性&#xff0c;你需要了解编译器是如何处理模板代码的。当编译器遇到模板方法定义时&#xff0c;它会进行语法检查&#xff0c;但实际上不会编译模板。编译器不能编译模板定义&#xff0c;…

Python Opencv实践 - 简单的AR项目

这个简单的AR项目效果是&#xff0c;通过给定一张静态图片作为要视频中要替换的目标物品&#xff0c;当在视频中检测到图片中的物体时&#xff0c;通过单应矩阵做投影&#xff0c;将视频中的物体替换成一段视频播放。这个项目的所有素材来自自己的手机拍的视频。 静态图片&…

Java注册并监听全局快捷键

背景 之前在博客中分享了SWT托盘功能, 随之带来一个问题, 当程序最小化后无法快速唤醒, 按照平时使用软件的思路, 自然想到了注册全局快捷键, 本文介绍使用java方式实现全局快捷键的注册. 方案 通过google,搜到一个现成的库: jintellitype, 使用maven可以直接引用, 非常方便…

istio为什么能代替传统的SpringCloud 服务网格Istio概述

服务网格Istio概述 什么是服务网格(Service Mesh)&#xff1f;istio简介边车模式&#xff08;Sidecar&#xff09;为什么istio能代替传统SpringCloud&#xff1f;整体架构 首先奉上 istio官网 什么是服务网格(Service Mesh)&#xff1f; 服务网格详解 服务网格&#xff08;Se…

JS - 包装类型

目录 1&#xff0c;什么是包装类型2&#xff0c;作用3&#xff0c;和其他引用类型的区别4&#xff0c;如何为基本类型添加属性或方法 1&#xff0c;什么是包装类型 在 js 中&#xff0c;数据类型分为基本数据类型和引用数据类型。 而这2个类型有个明显的区别&#xff1a;引用…

SpringMVC修炼之旅(2)基础入门

一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…

【JaveSE】:认识异常

异常 一.异常的概念二.异常的体系结构1.基础结构2.异常分类 三.异常的处理1.防御式编程2.异常的抛出3.异常捕获4.try-catch捕获并处理5.finally 四.异常处理流程五.自定义异常 一.异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。 算术异常 数组越界…

推荐一款手持式ECU刷写设备,国产软件配合使用

同星智能开发的一款手持式ECU刷写工具——TF1011&#xff0c;在TSMaster中导入诊断流程即可离线一键刷写。在 PC 端完成配置后&#xff0c;在设备可以在手持式离线场景下实现&#xff1a;基于 UDS 协议的诊断和基于 UDS 协议的 Flash Bootloader 程序更新功能。 产品简介—TF10…

Spring 面试题——事务

目录 1.谈谈对 Spring 事务的理解。2.Spring 管理事务的方式有哪几种&#xff1f;3.✨Spring 事务底层源码是如何实现的&#xff1f;3.1.后置处理3.2.事务执行3.3.总结 4.Transactional 注解有什么作用&#xff1f;它的常用属性有哪些&#xff1f;5.✨Spring 事务中的传播行为是…

ansible常用模块介绍

ansible运行模块的两种方式 Ad - Hoc 利用 ansible 命令直接完成管理 &#xff0c; 主要用于临时命令使用场景 ansible westos -m shell -a ls /mnt playbook ansible 脚本 &#xff0c; 主要用于大型项目场景 &#xff0c; 需要前期的规划 vim test.yml - hosts: all task…

【栈】车队

题目&#xff1a; /** 单调栈&#xff1a;存储到终点的时间&#xff0c;需要考虑浮点数* 思路&#xff1a;首先按照距离进行排序&#xff08;目的&#xff1a;如果离终点远的车辆用时比前面的车辆用时短&#xff0c;则是一个车队)* 排序后计算每一辆车辆的时间如果用…

web:[SUCTF 2019]CheckIn(一句话木马,.user.ini)

题目 页面显示 上传文件&#xff0c;随便上传一个文件试试 上传了一个文本&#xff0c;显示失败&#xff0c;不是图片 那就换图片马上传试试 不能包含<?,换一种写法&#xff0c;需要加上GIF89a&#xff0c;进行exif_imagetype绕过 上传成功 这里用.user.ini或者用post传参…

甘草书店:#8 2023年11月22日 星期三「“说一套做一套”的甘草与麦田」

最近与甘草书店的投资方和意向投资方沟通&#xff0c;听取了来自不同领域不同人群的观点。他们讲的都有道理&#xff0c;但他们说的都不是甘草。就像“麦田”成立之前&#xff0c;世间没有“麦田”一样&#xff1b;“甘草”出现之前&#xff0c;世间没有也没有“甘草”。 故事…