函数指针和函数指针数组及其应用

函数指针和函数指针数组及其应用1.函数指针先来看一个简单的例子。inta=3;void*p=&a;这是一个基础的不能再基础的例子。相信学过指针的都能看得懂。P是一个指针,指向a。a是一个整形变量。函数指针和其类似,只不过其指向的不是一个变量,而是一个函数,仅此而已。话不多说,看个例子。void(*funcPointer)(doublex);voidf1(doublex){}voidf

大家好,又见面了,我是你们的朋友全栈君。

1. 函数指针

先来看一个简单的例子。

int a=3;
void *p=&a;

这是一个基础的不能再基础的例子。相信学过指针的都能看得懂。P是一个指针,指向a。a 是一个整形变量。

函数指针和其类似,只不过其指向的不是一个变量,而是一个函数,仅此而已。话不多说,看个例子。

void (*funcPointer)(double x);
void f1(double x){}
void f2(double x){}
funcPointer=f1;
funcPointer=&f2;

好了。简单的5行代码就完成了一个简单的函数指针。我们一行行来看。

第一行。声明了一个函数指针。其和普通指针有啥区别。我放在一起让大家看一下。

void (*funcPointer)(double x);//函数指针
void *pointer;//普通指针

看出来了么。函数指针无非多了两个括号和一个参数列表。想想也是。函数指针如果没有参数列表那还玩个啥。所以肯定需要参数。那多那俩括号干嘛?好,那大家看一下这个例子。

void *funcPointer(double x);

长得是不是和函数指针贼像。其实也就是像而已,他们是两个东西。这个只是声明了一个普通的函数(我把它起名叫funcPointer,只是想对比一下),它的返回值是一个void类型的指针而已。有些地方也把它叫做指针函数(就是返回值为指针的函数)

好了声明说完了,我们接下来往下看。第二三行没啥说的,声明俩函数而已。

那么我么来看看四五行。函数指针既然是个指针,我们肯定要让它指东西啊。那么这两行就是让它指向具体的函数。这两种写法都是OK的。都可以被编译器接受。(以前只有第一种被认可,现在两种都可以了)

好了,说了这么多。总结一下。

函数指针就是指向函数体第一行可执行语句的一个指针。至于他有什么作用呢。这里给大家提供一个具体的应用的例子。

相信,大家中学的时候都学过积分这个鬼东西。不知道还记不记得积分最原始的计算方法。

对,没错,无限细分,求面积。好的。我们接下来就给大家一个应用函数指针有关积分计算的例子。

直接贴出代码。

#include <stdio.h> //Calculate用于计算积分。一共三个参数。第一个为函数指针func,指向待积分函数。二三参数为积分上下限double Calculate(double(*func)(double x), double a, double b){    double dx = 0.0001;//细分的区间长度    double sum = 0;    for (double xi = a+dx; xi <= b; xi+=dx)    {       double area = func(xi)*dx;       sum +=area;    }    return sum;} double func_1(double x){    return x*x;} double func_2(double x){    return x*x*x;} void main(){    printf("%lf\n", Calculate(func_1, 0, 1));    printf("%lf\n", Calculate(func_2, 0, 1));}

相信看了我刚才的介绍,这个例子很轻松就能看得懂。这个例子也清晰的把函数指针的作用表现的淋漓尽致。Calculate这个积分函数有一个参数是函数指针,那么我么在调用的时候只用传入具体的函数名,他就能计算出这个函数的积分。是不是很方便。所以说函数指针是个很好用的东西。

 

2. 函数指针数组

函数指针说完了。我们接下来来看看函数指针数组。

多了俩字。数组。前面四个字还一样。那是不是就是有一个数组,用它来盛放函数指针。嗯,没错,就是这样。

有了刚才的基础,我直接给出例子。

void (*funcPointerArray[3])(double x);//函数指针数组void (*funcPointer)(double x);//函数指针

两个放在一起对比,函数指针数组无非就像数组声明一样,在后面加了[]而已。仅此而已。

那它怎么用呢?

void f1(double x){}
void f2(double x){}
void f3(double x){}

来三个具体的函数,f1,f2,f3.

void (*funcPointerArray[3])(double x);
funcPointerArray[0]=f1;
funcPointerArray[1]=f2;
funcPointerArray[2]=f3;
 
funcPointerArray[0](“2.333333”);
funcPointerArray[1](“6.666666”);

 

简直就和普通的数组一模一样。没错,无非他存储的是函数指针而已。

最后,贴一个用函数指针数组的具体的应用的例子。

#include <stdio.h>

void addItem(char *name)
{
	printf("Add %s successfully!\n",name);
}

void deleteItem(char *name)
{
	printf("Delete %s successfully!\n", name);
}

void findItem(char *name)
{
	printf("Find %s successfully!\n", name);
}

void updateItem(char *name)
{
	printf("Update %s successfully!\n", name);
}

void main()
{
	void(*funcPointerArray[4])(char *name);
	funcPointerArray[0] = addItem;
	funcPointerArray[1] = deleteItem;
	funcPointerArray[2] = findItem;
	funcPointerArray[3] = updateItem;
	printf("Please enter a number(0-3) to continue:");
	int num;
	scanf_s("%d", &num,1);
	printf("Please enter the name of the goods:");
	char buf[128];
	scanf_s("%s", &buf,128);
	funcPointerArray[num](buf);
}

 

在上述的例子中,用函数指针数组代替了大量的switch case 直接通过传入的num值来调用不同的函数。

好了,相信讲到这里,大家应该清楚的明白什么是函数指针和函数指针数组了。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159747.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月15日 上午10:00
下一篇 2022年7月15日 上午10:00


相关推荐

  • 金山办公发布原生Office办公智能体“WPS灵犀” 接入多款豆包大模型

    金山办公发布原生Office办公智能体“WPS灵犀” 接入多款豆包大模型

    2026年3月12日
    1
  • 虚拟机安装完linux后怎么使用linux_虚拟机ubuntu安装教程

    虚拟机安装完linux后怎么使用linux_虚拟机ubuntu安装教程本篇文章为本人从零开始学习linux的学习心得,其中包含了部署虚拟环境安装linux系统。其中若有错误之处,请读者积极指出,让本人与读者共同进步。第一章部署虚拟环境安装linux系统及配置网路一、linux简介首先在学习linux系统之前,我觉得应该先了解一下linux的来历和发展历程,会让我们对linux充满好奇心,对后续的学习会有帮助。(搬砖):早在20世纪70年代,…

    2022年10月8日
    5
  • 数字电路实验(四)——寄存器、计数器及RAM

    数字电路实验(四)——寄存器、计数器及RAM1、实验步骤:A、指令计数器PC:1个vhd文件,用来定义顶层实体1个vwf文件,用来进行波形仿真,将验证的波形输入1、新建,编写源代码。(1).选择保存项和芯片类型:【File】-【newprojectwizard】-【next】(设置文件路径+设置projectname为【C:\Users\lenovo\Desktop\笔记\大二上\数字电路\实验课\实验四\PC】)-【nex…

    2022年7月12日
    25
  • 回归分析中自变量取舍、检验及多重共线性处理(VIF)「建议收藏」

    回归分析中自变量取舍、检验及多重共线性处理(VIF)「建议收藏」A1正交假定:误差项矩阵与X中每一个x向量都不相关高斯-马尔科夫定理:若满足A1和A2假定,则采用最小二乘法得到回归参数估计是最佳线性无偏估计方程估计值b1和b2可以看做偏回归系数,也是相应自变量对y的一种偏效应偏效应:在控制变量下,各自变量X对因变量Y的净效应残差项:针对具体模型而言,被定义为样本回归模型中观测值与预测值之差误差项:针对总体真实回归模型而言,它由一些不可观测因素或测量…

    2022年5月30日
    68
  • “腾讯元宝”可被添加为微信好友,根据不同场景自动调用混元大模型或DeepSeek

    “腾讯元宝”可被添加为微信好友,根据不同场景自动调用混元大模型或DeepSeek

    2026年3月13日
    2
  • Java 数组转 List 的 4 种方式

    Java 数组转 List 的 4 种方式目录前言【一】最常见方式(未必最佳)【二】数组转为List后,支持增删改查的方式【三】通过集合工具类Collections.addAll()方法(最高效)问题解答总结前言本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。【一】最常见方式(未必最佳)通过Arrays.asList(strArray)方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。关键代码:Listlist=Arrays.asList(

    2022年8月23日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号