函数指针的三种声明方式

部署运行你感兴趣的模型镜像
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int func(int a, int b)
{
	cout << "func(int, int)" << endl;
	return 0;
}

int func(int a, int b, int c)
{
	cout << "func(int, int,int )" << endl;
	return 0;
}

//方式1 :声明一种函数类型
typedef int(MY_FUNC)(int, int);

//方式2 :声明一种函数类型的指针类型
typedef int(*MY_FUNC_P)(int, int);//我喜欢这样用

int main(void)
{
	//1.方式1举例
	MY_FUNC *fp = NULL;
	fp = func;
	fp(15, 20);


	//2.方式2举例
	MY_FUNC_P fp1 = NULL;

	fp1 = func;
	fp1(25, 30);

	//方式3 :直接通过指针类型创建,不需用typedef预定义。
	int(*fp3)(int, int) = NULL;
	fp3 = func;
	fp3(27, 89);

	func(100, 200);
	func(100, 200, 300);

	fp3 = func; //fp3 ---> func(int,int)

	//实际上在给函数指针赋值的时候,是会发生函数重载匹配的
	//在调用函数指针的时候,所调用的函数就已经固定了。
	int(*fp4)(int, int, int) = NULL;
	fp4 = func; //fp4 ---> func(int,int,int)


	fp3(10, 30);//func(int,int)
	fp3(10, 20);

	fp4(10, 30, 30);

	return 0;
}/方式3 :直接通过指针类型创建,不需用typedef预定义,这个是最常用的!!!!!!!!!!!
	int(*fp3)(int, int) = NULL;
	fp3 = func;
	fp3(27, 89);

	func(100, 200);
	func(100, 200, 300);

	fp3 = func; //fp3 ---> func(int,int)

	//实际上在给函数指针赋值的时候,是会发生函数重载匹配的
	//在调用函数指针的时候,所调用的函数就已经固定了。
	int(*fp4)(int, int, int) = NULL;
	fp4 = func; //fp4 ---> func(int,int,int)


	fp3(10, 30);//func(int,int)
	fp3(10, 20);

	fp4(10, 30, 30);

	return 0;
}

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think> 在C++中,函数指针是指向函数的指针变量。它可以用来存储函数的地址,并且可以通过该指针调用函数。函数指针声明需要指定返回类型和参数类型,以便匹配目标函数的签名。 函数指针声明方式如下: 返回类型 (*指针变量名)(参数类型列表); 例如: - 指向一个无参数且返回void的函数的指针:`void (*funcPtr)();` - 指向一个有两个int参数且返回int的函数的指针:`int (*funcPtr)(int, int);` 我们也可以使用typedef或using来简化函数指针的类型声明,这样可以使代码更清晰。 下面是一个具体的例子: ```cpp #include <iostream> using namespace std; // 声明一个函数类型 typedef int (*ArithmeticFunc)(int, int); int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int main() { // 声明一个函数指针变量 ArithmeticFunc funcPtr = nullptr; funcPtr = add; cout << "10 + 5 = " << funcPtr(10, 5) << endl; funcPtr = subtract; cout << "10 - 5 = " << funcPtr(10, 5) << endl; return 0; } ``` 解释: 1. 使用typedef定义了一个函数指针类型`ArithmeticFunc`,它指向一个具有两个int参数并返回int的函数。 2. 定义了两个函数`add`和`subtract`,它们的函数签名与`ArithmeticFunc`匹配。 3. 在main函数中,声明了一个`ArithmeticFunc`类型的指针变量`funcPtr`,并先后指向`add`和`subtract`函数,然后通过指针调用函数。 另外,C++11引入了`std::function`和lambda表达式,它们提供了更灵活的方式来处理函数对象,但函数指针仍然是底层且高效的方式。 注意事项: - 函数指针必须与所指向的函数的返回类型和参数类型完全匹配(除了重载函数需要显式指定)。 - 函数指针可以指向任何具有匹配签名的函数,包括全局函数、静态成员函数。 - 非静态成员函数需要特殊的处理(使用成员函数指针,其声明方式不同)。 下面再给出一个使用函数指针作为函数参数的例子: ```cpp #include <iostream> using namespace std; int compute(int a, int b, int (*operation)(int, int)) { return operation(a, b); } int add(int a, int b) { return a + b; } int main() { cout << "compute(10, 5, add): " << compute(10, 5, add) << endl; return 0; } ``` 在这个例子中,`compute`函数接受两个整数和一个函数指针,然后使用该函数指针执行运算。 §§相关问题§§: 1. 如何声明一个指向成员函数的指针? 2. 函数指针和函数对象(仿函数)有什么区别? 3. C++11中的std::function是什么?它和函数指针有什么区别? 4. 如何将lambda表达式赋值给函数指针? </think>在C++中,函数指针是指向函数的指针变量,它允许我们动态选择要调用的函数。以下是函数指针声明方式: ### 函数指针声明语法 ```cpp // 基础语法 返回类型 (*指针名称)(参数类型列表); // 带typedef/using的语法(推荐) typedef 返回类型 (*类型别名)(参数类型列表); using 类型别名 = 返回类型 (*)(参数类型列表); ``` ### 示例代码 ```cpp #include <iostream> // 普通函数声明 int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } void show(const char* msg) { std::cout << msg << std::endl; } int main() { // 方式1:直接声明函数指针 int (*funcPtr1)(int, int) = nullptr; funcPtr1 = &add; // 取地址符可选 std::cout << "Add result: " << funcPtr1(5, 3) << std::endl; // 输出8 // 方式2:使用typedef定义类型 typedef int (*MathOperation)(int, int); MathOperation funcPtr2 = sub; std::cout << "Sub result: " << funcPtr2(5, 3) << std::endl; // 输出2 // 方式3:使用using定义类型(C++11+) using DisplayFunc = void (*)(const char*); DisplayFunc display = show; display("Hello Function Pointer!"); // 方式4:函数指针数组 MathOperation operations[] = {add, sub}; for (auto op : operations) { std::cout << "Result: " << op(10, 4) << std::endl; } return 0; } ``` ### 解释说明 1. **基本声明** `返回类型 (*指针名)(参数类型)` 是最直接的声明方式,例如: ```cpp int (*funcPtr)(int, int); // 指向返回int且接受两个int参数的函数 ``` 2. **typedef/using 别名** 推荐使用类型别名简化复杂声明: ```cpp typedef int (*MathFunc)(int, int); // C风格 using MathFunc = int (*)(int, int); // C++11风格 ``` 3. **赋值与调用** - 赋值时可省略取地址符 `&`(函数名自动转换为指针) - 调用时可省略解引用 `*`(函数指针直接调用) ```cpp funcPtr = add; // 等价于 funcPtr = &add int r = funcPtr(2,3); // 等价于 (*funcPtr)(2,3) ``` 4. **特殊类型处理** - 无参数函数:`void (*ptr)()` - 返回指针的函数:`int* (*ptr)(int)` - 带const参数的函数:`void (*ptr)(const int)` 5. **应用场景** - 回调函数机制 - 策略模式实现 - 动态选择算法 - 事件处理系统 ### 注意事项 1. 函数指针类型必须与目标函数签名**完全匹配** 2. 成员函数需要特殊处理(需使用成员函数指针语法 `ClassName::*`) 3. C++11 推荐使用 `std::function` 作为更安全的替代方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值