函数指针的书写和用法

这篇博客介绍了C语言中函数指针的概念和用法,包括如何声明和使用函数指针,以及如何创建函数指针数组。示例代码展示了如何定义包含函数指针的结构体,以及如何通过函数指针数组调用不同的函数,如加法、乘法、除法和减法操作。博客强调了在处理函数指针时理解结合性的关键性,以避免语法错误。

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

1.用来访问函数

2.是可以具有封装特性,如结构体中可以包含函数指针,不同的结构体可以包含有相同名字的函数指针,这样不会导致冲突。(避免重复定义,也其实就是访问函数)

写法 返回值 +指针 +函数变量类型=函数名

int(*p)(int,int)=add

当然也有函数指针数组

int(*p[4])(int a,int b)={add,mul,jan,an};//*号的结合性小于括号的

完整演示

#include<stdio.h>
int add(int a,int b)
{
	return a+b;
}
int mul(int a,int b)
{
	return a*b;
}
int jan(int a,int b)
{
	return a/b;
}
int an(int a,int b)
{
	return a-b;
}
int main()
{
	int(*p[4])(int a,int b)={add,mul,jan,an};//*号的结合性小于括号的
	for ( int i = 0; i < 4; i++)
	{
		printf("%d\n",p[i](3,4));
	}
	
	return 0;
}

注意:在对结合性不了解时根据意思写每一段放一个括号,写了不会错,相反不写有很大可能会出错

### C++函数指针的使用方法 #### 基本概念 在C++中,函数指针是一种特殊的指针变量,它可以指向具有特定签名的函数。利用函数指针可以在运行时动态决定要执行哪个函数,从而增加程序灵活性模块化程度[^1]。 #### 定义与声明 为了声明一个能够存储某个类型的返回值并接受一定参数列表的函数地址的指针,语法如下所示: 对于简单情况可以直接出完整的原型: ```cpp // 返回int类型且带两个整型参数的函数指针pf int (*pf)(int, int); ``` 也可以采用`typedef`简化后续书写工作量: ```cpp // 创建别名IntFuncPtr表示上述相同特性的函数指针 typedef int (*IntFuncPtr)(int, int); // 使用新创建的别名来定义具体实例 IntFuncPtr pf; ``` #### 赋值操作 一旦有了合适的函数指针之后就可以将其绑定到具体的函数上去了。这通常意味着把目标函数的名字赋给该指针而不需要加上括号或任何参数表。 ```cpp bool compareLength(const std::string& str1, const std::string& str2){ return str1.length() < str2.length(); } // 将compareLength函数作为实参传入packageFunc int result = packageFunc(someString1, someString2, compareLength)[^3]; ``` #### 实际应用案例 当涉及到更复杂的场景比如回调(callbacks),事件驱动编程(event-driven programming)或是实现更高层次抽象(Higher-order functions)的时候,函数指针就显得尤为重要了。下面给出一段简单的代码片段用于演示如何在一个类内部注册多个不同行为的方法以便稍后触发它们中的某一种。 ```cpp class EventManager { public: void RegisterHandler(int id,void(*handler)()){ handlers[id]= handler; } void TriggerEvent(int id){ auto it=handlers.find(id); if(it!=handlers.end()) (it->second)(); } private: std::map<int,void(*)()> handlers; }; ``` 通过这种方式可以很容易地构建起一套松耦合的设计模式,在不影响原有逻辑结构的前提下轻松添加新的功能组件[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学c的小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值