指针函数、函数指针、函数指针数组的相关概念

本文介绍了函数指针的概念及其在积分计算中的应用,通过一个示例展示了如何使用函数指针实现动态调用不同积分函数。同时,还讲解了如何用typedef定义函数类型,并给出了函数指针数组的实例,说明其在简化switch-case语句中的作用,实现了数据驱动的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.指针函数

        指针函数:本质是一个函数,返回值为指针

int *func(int a, int b, ...);

2.函数指针

函数指针:本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。

int(*func)(int a, int b, ....);

函数指针的两个典型应用

1)将函数作为参数传递给函数(此部分转自https://blog.youkuaiyun.com/yuexiang321/article/details/52658947)

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

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

#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));  
} 

这里函数指针作为函数的形参,在函数调用时,可以带入已有的同类型函数,再对函数指针进行解引用,就可以获取到函数指针指向的函数。

2)定义一种函数类型,便于定义函数,可以理解为自己定义一种类似于int 等的类型,定义一个函数就直接用类型名加函数名就可以。

typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);
//用typedef来声明函数
pCopySDMMC2Mem  pf1, pf2;
//定义两个该类型的函数

3.函数指针数组

        函数指针数组:本质上是数组,该数组的每一个元素都是函数指针。

        (此部分转自https://blog.youkuaiyun.com/yuexiang321/article/details/52658947)

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

函数指针数组的实际例子:

#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 语句,也就是数据驱动方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值