【C语言】善于利用指针(三)
💗个人主页💗
⭐个人专栏——C语言初步学习⭐
💫点击关注🤩一起学习C语言💯💫
目录
- 导读:
- 1. 函数指针
- 1.1 什么使函数指针
- 1.2 用函数指针变量调用函数
- 2. 返回指针值的函数
- 3. 函数指针数组
- 3.1 实现计算器
导读:
我们在前面的善于利用指针一和善于利用指针二中,已经学习了很多关于指针的知识,比如指针的类型,数组指针和字符指针,不过前面都是相对于基础的,今天我们来更进一步的学习函数指针。
1. 函数指针
1.1 什么使函数指针
如果在程序中定义了一个函数,在编译时会把函数的源代码转换为可执行代码并分配 一段存储空间。这段内存空间有一一个起始地址,也称为函数的入口地址。每次调用函数时都从该地址入口开始执行此段函数代码。
函数名代表函数的起始地址。调用函数时,从函数名得到函数的起始地址,并执行函数代码。
可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:
int (*p)(int,int)
定义p是一个指向函数的指针变量,它可以指向函数类型为整型且有两个整型参数的函数。此时,指针变量p的类型用 int( * )(int, int)表示。
1.2 用函数指针变量调用函数
如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量来调用函数。
【例1.1】:用函数求整数a和b的较大者。
int MAX(int x, int y)
{return (x > y ? x : y);
}
int main()
{int a = 0;int b = 0;printf("请输入两个整数a 和 b:");scanf("%d%d", &a, &b);int (*p)(int, int) = MAX;//定义一个指针变量p指向MAX函数//int 表示函数返回值是整型//(int,int)表示函数有两个int型参数int max = (*p)(a, b);printf("max = %d\n", max);return 0;
}
** 注意: **
*p 两侧的括号不能省略,表示p先与 * 结合,是指针变量,然后再与后面的()结合,()表示是函数,即该指针变量不是指向一般的变量,而是指向函数。
2. 返回指针值的函数
返回指针值的函数是指返回一个指针类型的函数。
int* getPointer(int num)
{int* p = #return p;
}int main()
{int n = 10;int* ptr = getPointer(n);printf("n的值: %d\n", n);printf("n的地址: %p\n", &n);printf("ptr的值: %p\n", ptr);printf("ptr的地址: %d\n", *ptr);return 0;
}
在上面的例子中,getPointer()函数返回一个指向整数num的指针。在主函数中,将整数n初始化为10,然后调用getPointer()函数,并将返回的指针存储在指针变量ptr中。最后,使用printf()函数输出n变量和ptr指针的值,以及ptr指针指向的值。
3. 函数指针数组
数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,比如:
int *arr[10];//数组的每个元素是int*
把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
int (*parr1[10])();
parr1先和[]结合,说明 parr1是数组,数组的内容是什么呢?
是int (*)()类型的函数指针。
函数指针数组的用途:转移表
接下来我们来实现一个计算器。
3.1 实现计算器
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x = 0;int y = 0;int input = 1;int ret = 0;int(*p[5])(int x, int y) = { 0, add, sub, mul, div}; //转移表while (input){printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);if ((input <= 4 && input >= 1)){printf("输入操作数:");scanf("%d %d", &x, &y);ret = (*p[input])(x, y);}else{printf("输入有误\n");}printf("ret = %d\n", ret);}return 0;
}
相关文章:

【C语言】善于利用指针(三)
💗个人主页💗 ⭐个人专栏——C语言初步学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:1. 函数指针1.1 什么使函数指针1.2 用函数指针变量调用函数 2. 返回指针值的函数3. 函数指针数组3.1 实…...

ant design vue Message 用法以及内容为 html片段情况
ant design vue 的 Message 用法 全局展示操作反馈信息 何时使用 # 可提供成功、警告和错误等反馈信息。顶部居中显示并自动消失,是一种不打断用户操作的轻量级提示方式。 全局配置: // main.ts// 进行全局配置 message.config({top: 0.7rem,//高度…...
HotSpot算法细节实现——安全点
OopMap 垃圾回收时,如何找到垃圾? 在可达性分析算法中从GC Roots集合找引用链分析对象是否可达。 固定可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表…...

杂谈:DC对Verilog和SystemVerilog语言的支持
DC对Verilog和SystemVerilog语言的支持 设计语言用哪种?Design Compiler对二者的支持简单的fsm电路测试测试结果对比写在最后 设计语言用哪种? 直接抛出结论:先有电路,后为描述。设计端而言,没有语言的高低好坏&#…...
网络安全评估(网络安全评估)
讨论了基于互联网的网络安全评估和渗透测试的基本原理,网络安全服务人员,安全运营人员,通过评估来识别网络中潜在的风险,并对其进行分类分级。 黑客通常采取的攻击方式如下: 突破目标外围系统,比如主站拿…...

offsetof宏计算某变量相对于首地址的偏移量
宏:offsetof的使用 //offsetof (type,member) //type是结构体的类型名,member是结构体中的成员名。struct Student {char name[5]; // 姓名int age; // 年龄float score; // 成绩 };int main() {struct Student s;printf("%zd\n", off…...
算法|每日一题|统计无向图中无法互相到达点对数|并查集
2316. 统计无向图中无法互相到达点对数 原题地址: 力扣每日一题:统计无向图中无法互相到达点对数 给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i…...

浏览器的四种缓存协议
❤️浏览器缓存 在HTTP里所谓的缓存本质上只是浏览器和业务侧根据不同的报文字段做出不同的缓存动作而已 四种缓存协议如下 Cache-ControlExpiresETag/If-None-MatchLast-Modified/If-Modified-Since 🎡Cache-Control 通过响应头设置Cache-Control和max-age&…...
力扣每日一题55:跳跃游戏
题目描述: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 …...
mssql调用外部接口
前言: 断更很久了。 是因为这段时间发现,AI出来之后,很多博客都没有记录的必要了,你问他他都能即时告诉你。 这篇博客产出的原因是,看到一份奇葩需求,说数据库改某行数据的状态字段,也要调用接…...
npx是什么命令?npx和npm有什么区别?
平时安装node模块的时候,经常使用的命令是npm。其实还有另外一个命令,叫做npx。网上的说法都是:npx是npm命令的升级版本,功能非常强大。 npx 是什么 npx是一个由Node.js官方提供的用于快速执行npm包中的可执行文件的工具。它可以…...

1997-2017年各省能源投入数据(万吨标准煤)
1997-2017年各省能源投入数据(万吨标准煤) 1、时间:1997-2017年 2、来源:中国统计年鉴 3、范围:30个省 4、指标:能源投入(各省8种能源消费总量计算得出)(万吨标准煤&…...
C++ Primer笔记001:标准输入输出/基本数据/流程控制语句
文章目录 1.标准输入cin:2.标准输入cout:3.endl:4.命名空间(namespace):5.有符号类型和无符号类型6.字面值常量7.变量的初始化和赋值8.变量的作用域9 求余运算符的符号10.关于sizeof11.switch case语句漏写break 1.标准…...

【C++进阶之路】IO流
文章目录 一、C语言的IO1.键盘与显示屏2. 文件与内存3.字符串与内存 二、CIO1.iostream1.1基本使用1.2operator bool 2. fstream2.1二进制的文件读写2.2字符串的文件读写 3. sstream3.1序列化与反序列化3.2拼接字符串3.3将数据类型转换为字符串 总结 一、C语言的IO 1.键盘与显…...
$GNGGA,传感器传输的数据解析
每一秒传输这一帧数据如下: $GNGGA,090022.000,3959.82136,N,11628.16507,E,1,06,3.5,21.4,M,0.0,M,,*4D $GNGLL,3959.82136,N,11628.16507,E,090022.000,A,A*4F $GPGSA,A,3,03,16,26,,,,,,,,,,4.1,3.5,2.1*32 $BDGSA,A,3,07,21,42,,,,,,,,,,4.1,3.5,2.1*21 $GPGSV…...

javaEE - 2(11000字详解多线程)
一:多线程带来的的风险-线程安全 线程安全的概念:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。 当多个线程同时访问共享资源时,就会产生线程安全的风险&am…...

easyphoto 妙鸭相机
AIGC专栏7——EasyPhoto 人像训练与生成原理详解-CSDN博客如何训练一个高品质的人像Lora与应用高品质Lora的链路对于写真生成而言非常重要。由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法&#x…...

【Qt控件之QMdiArea】介绍及使用
描述 QMdiArea小部件提供了一个区域,用于显示MDI窗口。QMdiArea的功能类似于MDI窗口的窗口管理器。例如,它在自身上绘制和排列管理的窗口,可以按级联或平铺模式排列它们。通常,QMdiArea被用作QMainWindow的中心小部件,…...
Linux网络编程-极简HTTPUDP服务器
HTTP服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h>#define PORT 8080 #define BUFFER_SIZE 2048void handle_client(int client_socket) {char buffer[BUFFER_SIZE];recv(cl…...

虚拟化、容器与Docker基本介绍以及安装部署(Docker 基本管理)
目录 1 Docker 概述 1.1 Docker与虚拟机的区别 1.2 容器在内核中支持2种重要技术 1.3 Docker核心概念 2 安装 Docker 2 Docker 镜像操作 2.1 搜索镜像 2.2 获取镜像 2.3 镜像加速下载 2.4 查看镜像信息 2.4.1 查看下载的镜像文件信息 2.4.2 查看下载到本地的所有镜像…...
深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
前言 《深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)》里面我只是提到了对conv1层进行剪枝,只是为了验证这个剪枝的整个过程,但是后面也有提到:仅裁剪 conv1层的影响极大,原因如…...

计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!
继续收集数据集,话不多说,见下文! 今天分享一个计算机网络安全问答数据集(1788条),适用于AI大模型训练、智能体知识库构建、安全教育系统开发等多种场景! 一、数据特点 结构清晰:共计1788条&…...
图简记。。
模仿: algorithm-journey/src/class059/Code01_CreateGraph.java at main algorithmzuo/algorithm-journey Code01_CreateGraph C语言: #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAXN 11 #define MAX…...

从0开始学vue:pnpm怎么安装
一、什么是 pnpm? pnpm(Performant npm)是新一代 JavaScript 包管理器,优势包括: 节省磁盘空间:通过硬链接和符号链接实现高效存储安装速度更快:比 npm/yarn 快 2-3 倍内置工作区支持…...

基于51单片机的车内防窒息检测报警系统
目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体实现功能: (1)检测车内温度及二氧化碳浓度并用lcd1602实时显示。 (2)当人体红外传感器检测到车内有人,且温度或二氧化碳浓度…...

嵌入式学习之系统编程(十)网络编程之TCP传输控制协议
目录 一、网络模型 1、服务器/客户端模型 2、C/S与B/S区别 3、P2P模型 二、TCP(传输控制协议) (一)TCP概述 (二)TCP的特征(面问高频问题) 1、有链接 三次握手:建…...
rocketmq索引
索引的理解 索引是什么, 索引实质是 相同数据的另一种存储结构 我们都知道读和写天然是存在矛盾的, 我们希望写的快,当然是顺序写的性能最高, 顺序写造成数据杂乱无章,没法按照一定的规律去找数。 如果想要找数的效率高, 必须要有结构组织的存放数据, 这样方便按规律找…...

Windows下运行Redis并设置为开机自启的服务
下载Redis-Windows 点击redis-windows-7.4.0下载链接下载Redis 解压之后得到如下文件 右键install_redis.cmd文件,选择在记事本中编辑。 将这里改为redis.windows.conf后保存,退出记事本,右键后选择以管理员身份运行。 在任务管理器中能够…...

Kafka 安装教程(支持 Windows / Linux / macOS)
一、下载 1、kafka官网下载地址:https://kafka.apache.org/downloads 根据实际情况下载对应的版本 2、JDK的版本最好是17+ JDK下载地址:https://www.oracle.com/java/technologies/javase/jdk17-0-13-later-archive-downloads.html 二、安装 前置条件 安装 Java(至少 Jav…...
Elasticsearch中的自定义分析器(Custom Analyzer)介绍
在 Elasticsearch 中,自定义分析器(Custom Analyzer) 是一种可配置的文本处理组件,允许用户通过组合分词器(Tokenizer)、过滤器(Token Filter)和字符过滤器(Character Filter)来定义特定的文本分析逻辑。这使得 Elasticsearch 能够针对不同语言、业务场景或特殊需求,…...