C语言——函数指针

article/2025/9/29 3:38:25

函数指针

C语言中的指针类型有很多种,但是函数指针可能有些小伙伴没听过,下面我们引入一段定义。

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

一、C语言中的函数指针咋来的?

1、函数是C语言中的一段代码;

2、编译器把这个C代码转成二进制指令,放到可执行文件中;

3、操作系统执行这个程序的时候(比如双击exe文件),就还把这个二进制的文件指令加载到内存中;

4、在内存中,就会有这个函数的地址,把这个地址取出来放入一个指针变量中,此时这个指针变量就是一个"函数指针"。

二、函数指针如何使用(基本操作)?

C语言中直接获取函数名,就可以得到这个函数的函数指针。

void test(int a){}test;//这就是一个函数指针,它的类型是void(*)(int)的

函数指针和普通指针操作的差别较大,普通指针的操作有:解引用,取地址,加减整数,指针相加减……

但是对于函数指针来说,上述操作都不可以(解引用操作和取地址操作也可以运算,但是行为和普通指针不同)

函数指针有一个独特的操作,函数调用操作,即为函数指针(参数列表),这是普通指针不具备的功能。

看下面一段例子,如果有不懂,请仔细阅读注释部分

#include <stdio.h>void test1(int a){printf("测试\n");
}int main(){//这里将void(*)(int)类型的函数指针重命名为Ptypedef void(*P)(int a);//定义一个P类型,也就是void(*)(int)类型的函数指针,命名为p//并将void(*)(int)类型的函数指针test1赋值给p(初始化)P p = test1;//调用函数操作p(1);//用解引用的方式调用函数,和上面的完全等价(*p)(1);//取地址操作P p1 = &test1;//用取地址的方式调用函数,和上面的完全等价p1(1);return 0;
}

运行结果:

三、具体用途

1、我们可以用函数指针数组来一定程度上的简化代码,也就是我们所说的表驱动方式

     看下面一段代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>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 divi(int a, int b){return a / b;
}int main(){printf("请输入要选择的运算\n");printf("1、加法\t\t2、减法\n");printf("3、乘法\t\t4、除法\n");int choice = 0;scanf("%d", &choice);printf("输入两个数\n");int a = 0;int b = 0;scanf("%d %d", &a, &b);int res = 0;if (choice == 1){res = add(a, b);}else if (choice == 2){res = sub(a, b);}else if (choice == 3){res = mul(a, b);}else if (choice == 4){res = divi(a, b);}printf("res=%d", res);return 0;
}

我们观察这这四个函数都是int (*)(int ,int)类型的函数,所以我们可以用一个数组来存放这4个函数

具体情况如下:代码的注释中有主要思想

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>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 divi(int a, int b){return a / b;
}int main(){//将int(*)(int, int)类型的函数指针重命名为Ptypedef int(*P)(int, int);//定义一个P类型的也就是int(*)(int, int)类型的数组//这里将4个函数的指针传入//注意这里要将数组的下标和对应的函数建立联系P p[5] = {NULL,add,sub,mul,divi};printf("请输入要选择的运算\n");printf("1、加法\t\t2、减法\n");printf("3、乘法\t\t4、除法\n");int choice = 0;scanf("%d", &choice);printf("输入两个数\n");int a = 0;int b = 0;scanf("%d %d", &a, &b);//根据用户的选择choice选择调用对应的函数int res = p[choice](a, b);printf("res=%d", res);return 0;
}

2、回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

下面以冒泡排序法为例

#include <stdio.h>typedef int(*Cmp)(int a, int b);void bubbleSort2(int arr[], int size, Cmp cmp) {for (int bound = 0; bound < size; bound++) {for (int cur = size - 1; cur > bound; cur--) {// cur - 1 的位置在前// cur 的位置在后// 如果发现 cmp 的函数返回值 为 1if (cmp(arr[cur - 1], arr[cur]) == 1) {int tmp = arr[cur - 1];arr[cur - 1] = arr[cur];arr[cur] = tmp;}}}
}// 如果按照升序排序
// a 应该在 b 之前, 就让函数返回 -1
// a 应该在 b 之后, 就让函数返回 1
// a 和 b 一样大, 就返回 0
int less(int a, int b) {if (a == b) {return 0;}if (a < b) {return -1;}return 1;
}int main(){int arr[] = { 9, 5, 2, 7 };bubbleSort2(arr, 4, less);for (int i = 0; i < 4; i++) {printf("%d\n", arr[i]);}return 0;
}

今天的分享就到这里了,希望大家一起提高!

 

 

 

 

 


http://chatgpt.dhexx.cn/article/v23W8Q4v.shtml

相关文章

《信号与系统》小结

参考书目&#xff1a;《信号与系统(第四版) 徐亚宁 苏启常 编著》 信号与系统 信号是消息的表现形式&#xff0c;消息是信号的具体内容。也就是说任何可以承载某种消息的物理量都可以是信号。电信号只是生活中最快捷&#xff0c;也是最常用的一种。我们可以从变化的电流或电压…

信号与系统(一) 信号与系统的基本概念

1.1信号的描述 信号的描述方式采用的有3种——函数、图形和数据 1.2信号的大小 对于一个信号x(t)&#xff0c;它的能量大小为&#xff0c;但是当&#xff0c;而信号的强度不趋向于0时&#xff0c;信号能量为无限大&#xff0c;这时候就需要使用信号的功率来判断大小&#xf…

连续系统分析【信号与系统四】

连续系统分析 一、已知描述连续系统的微分方程&#xff0c;计算该系统的响应并与理论结果比较二、研究具有以下零极点的连续系统2.1 1个极点s-0.1&#xff0c;增益k12.2 1个极点s0&#xff0c;增益k12.3 2个共轭极点 &#xff0c;增益k12.4 2个共轭极点 &#xff0c;增益k12.5 …

信号与系统_第二章 连续系统的时域分析

第二章 连续系统的时域分析 ( 连续系统在时域上进行分析 ) 2.1 引言 2.2 LTI系统的微分方程表示及响应 2.3 零输入响应与零状态响应 2.4 单位冲激响应 2.5 卷积积分 2.6 卷积积分的性质 2.7 奇异函数 2.8 连续时间系统的模拟 习题 2.01_连续系统的描述: 电路图建立微分…

《信号与系统》解读 第1章 信号与系统概述-1:信号与系统的描述和分析方法

目录 1. 什么是广义的信号和系统 2. 什么是狭义的电信号和电系统 3. 两个研究对象&#xff1a;信号系统 4. 两种分析方法&#xff1a;几何图形法数学函数法 5. 两个维度与视角&#xff1a;时域频域 6. 两种坐标&#xff1a;实平面复平面 7. 目标&#xff1a;模拟信号处理…

【信号与系统学习笔记 3】—— 系统,以及系统的性质以及判断方法解析

文章目录 一、系统的分类二、系统的性质2.1 记忆性和无记忆性2.2 可逆性与可逆系统2.3 稳定性2.4 因果性2.5 时不变性2.7 线性性 一、系统的分类 其实&#xff0c;系统的分类无非就是两大类&#xff1a;离散时间系统、一个是连续时间系统 那么&#xff0c;如何判断呢&#xf…

信号与系统知识点记录(P2-P3)

P2: 连续余弦信号和离散余弦信号的不同。 周期不同。 时移和相位关系不同。 还有个有趣的性质&#xff0c;离散信号里面&#xff0c;频率相差2Π的整数倍&#xff0c;得到的离散信号是一样的。 后面又实数的指数信号和复数的指数信号的推导过程 离散脉冲函数在信号和系统里…

信号与系统_第2章 连续系统的时域分析

2.1 LTI连续系统的响应 前言 LTI连续系统的时域分析&#xff0c;归结为&#xff1a;建立并求解线性微分方程。 由于在其分析过程涉及的函数变量均为时间t&#xff0c;故称为时域分析法。这种方法比较直观&#xff0c;物理概念清楚&#xff0c;是学习各种变换域分析法的…

数字信号处理:重要知识点整理

文章目录 0 最重要&#xff01;DFT和FFT的区别1 连续时间信号频域分析2 通过离散时间信号的Z变换表达式X(z)直接写出时域离散信号&#xff08;序列&#xff09;x(n)的方法3 部分分式法的MATLAB实现&#xff08;求X(z)的部分展开式&#xff09;4 稳定系统5 求频响特性&#xff0…

信号与系统常见问题总结(1)

在做题中遇到的一些问题和解决方案。 信号与线性系统 1.三大变换的正变换和逆变换2.变换的时候注意看是单边还是双边变换。3.对信号进行基本的尺度变换的顺序&#xff0c;先平移&#xff0c;再反转&#xff0c;再压缩。4.怎么判断系统的特性 --线性&#xff0c;时变&#xff0c…

领悟《信号与系统》之 信号与系统概论

信号与系统概论 一、信号与系统基本概念0. 信息是什么&#xff1f;1. 信号是什么&#xff1f;2. 系统是什么&#xff1f;3. 信号与系统学的什么&#xff1f; 二、常见的信号与系统实例三、信号与系统分析的意义 在《信号与系统》中&#xff0c;这个学科把真实的物理情况抽象出来…

信号与系统复习归纳(二):连续时间信号和系统+例题

目录 1 连续时间信号的变换2 信号的性质3 复指数函数的性质4 奇异函数5 信号的数学函数6 连续时间系统7 连续时间系统的性质参考文献 1 连续时间信号的变换 实变量实函数的六种基本变换&#xff1a; &#xff08;1&#xff09;时间反转变换&#xff08;关于独立变量t&#xff…

领悟《信号与系统》之 信号与系统的描述-下节

信号与系统的描述-下节 一、信号的基本运算1. 信号的基本运算1. 加法 、减法2. 乘法、除法3. 微分 、差分4.积分、迭分 2. 关于时间&#xff08;自变量&#xff09;的运算1. 位移2. 反折3. 尺度变换 二、阶跃信号与冲激信号1. 单位阶跃信号2. 单位阶跃信号的特性3. 单位冲激信号…

信号与系统第一章--基本知识

1.信号的基本概念 1.1信号分类 确定信号&#xff1a;可用确定时间函数表示的信号 &#xff08;电流 电压 fx&#xff09; 随机信号&#xff1a;不能用确定的函数描述&#xff0c;只可能知道它的统计特性。如概率 &#xff08;雷电干扰信号&#xff09; 1.1.1确定信号的分类&…

【信号与系统】(一 )信号与系统概述——信号的基本概念与分类

文章目录 第一章 信号与系统概述1.1 信号的基本概念与分类1.1.1 消息、信息、信号1.1.2 信号的描述1.1.3 信号的分类1.1.3.1 确定信号和随机信号1.1.3.2 连续信号和离散信号1.1.3.3 周期信号与非周期信号1.1.3.4 能量信号和功率信号1.1.3.5 因果信号和反因果信号1.1.3.6 一维信…

信号与系统复习概括

本文是针对自己信号与系统理解不够透彻的一些知识点的梳理&#xff0c;仅供自己学习使用&#xff0c;内容可能有些杂乱。 一、信号与系统总体描述 Q1:信号与系统这门课程讲了什么&#xff1f; 主要从输入-输出描述法出发&#xff0c;研究确定性信号经线性时不变系统&#xff0c…

信号与系统_定义总结

在连续的时间范围内(-∞< t <∞&#xff09;有定义的信号称为连续时间信号&#xff0c;简称连续信号。 在连续的时间范围内(-∞< t <∞&#xff09;有定义的信号称为连续时间信号&#xff0c;简称连续信号。 定义在(-∞&#xff0c;∞)区间&#xff0c;每隔一定时…

信号与系统基础简单知识概括

连续时间和离散时间信号 定义 1、自变量连续可变的信号为连续时间信号或 者模拟信号。 2、自变量离散的信号为离散时间信号。 时移 左加右减 时反 尺度变换 原信号为&#xff1a;x(t) 经过尺度变换后的信号为&#xff1a; x&#xff08;t&#xff09;x&#xff08;at&#…

信号与系统:综述【知识梳理】

一、绪论知识 1、信号的描述、分类和常见的信号 通信系统&#xff1a;信源→信道→信宿消息与信号&#xff1a; 消息是信号的具体内容信号是消息的表现形式 信号处理&#xff1a; 目的&#xff1a;更好的进行信号传输与交换方法&#xff1a;去除噪声与干扰&#xff0c;将信号…