C/C++函数指针

在 C++ 中,函数指针是一种指向函数的指针变量,可以用于调用函数或作为回调函数传递。以下是函数指针的详细写法及用法:


  1. 函数指针的基本声明

函数指针的声明方式与函数声明类似,但需要将指针名放在*后面,并用括号包裹:

语法

【cpp】

返回类型 (*指针变量名)(参数类型1, 参数类型2, ...);

示例

【cpp】

// 定义一个普通函数

int add(int a, int b) {

return a + b;

}

// 声明一个函数指针,指向返回 int 并接受两个 int 参数的函数

int (*funcPtr)(int, int);

// 将函数地址赋值给指针

funcPtr = add;

// 通过函数指针调用函数

int result = funcPtr(3, 4); // 调用 add(3, 4),result = 7


  1. 函数指针作为参数

函数指针可以像普通变量一样作为函数参数传递,常用于回调机制。

示例

【cpp】

#include

void printHello() {

std::cout << "Hello, World!" << std::endl;

}

void printGoodbye() {

std::cout << "Goodbye!" << std::endl;

}

// 接受一个无参数、无返回值的函数指针

void callFunction(void (*func)()) {

func(); // 调用传入的函数

}

int main() {

callFunction(printHello); // 输出 "Hello, World!"

callFunction(printGoodbye); // 输出 "Goodbye!"

return 0;

}


  1. 函数指针数组

可以定义一个函数指针数组,用于存储多个函数指针。

示例

【cpp】

#include

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 main() {

// 定义函数指针数组

int (*operations\[\])(int, int) = {add, sub, mul};

复制代码
int x = 10, y = 5;

// 调用不同的函数
std::cout << operations[0](x, y) << std::endl; // add(10, 5) = 15
std::cout << operations[1](x, y) << std::endl; // sub(10, 5) = 5
std::cout << operations[2](x, y) << std::endl; // mul(10, 5) = 50

return 0;

}


4.typedef或using简化函数指针类型

为了简化复杂的函数指针声明,可以使用typedef或using定义别名。

方法 1:typedef

【cpp】

typedef int (*MathFunc)(int, int); // 定义函数指针类型

int add(int a, int b) { return a + b; }

int main() {

MathFunc func = add; // 使用别名声明函数指针

std::cout << func(3, 4) << std::endl; // 输出 7

return 0;

}

方法 2:using(C++11 推荐)

【cpp】

using MathFunc = int (*)(int, int); // 定义函数指针类型

int add(int a, int b) { return a + b; }

int main() {

MathFunc func = add; // 使用别名声明函数指针

std::cout << func(3, 4) << std::endl; // 输出 7

return 0;

}


  1. 函数指针与std::function(C++11 推荐)

C++11 引入了std::function,它可以存储任意可调用对象(函数、Lambda、函数对象等),比传统函数指针更灵活。

示例

【cpp】

#include

#include // 需要包含头文件

int add(int a, int b) { return a + b; }

int main() {

// 使用 std::function 存储函数指针

std::function<int(int, int)> func = add;

复制代码
std::cout << func(3, 4) << std::endl; // 输出 7

// 也可以存储 Lambda
std::function<int(int, int)> lambdaFunc = [](int a, int b) { return a * b; };
std::cout << lambdaFunc(3, 4) << std::endl; // 输出 12

return 0;

}


  1. 成员函数指针

成员函数指针的声明方式与普通函数指针不同,需要指定类名。

示例

【cpp】

#include

class MyClass {

public:

void printMessage() {

std::cout << "Hello from MyClass!" << std::endl;

}

};

int main() {

// 声明成员函数指针

void (MyClass::*memberFuncPtr)() = &MyClass::printMessage;

复制代码
MyClass obj;
// 调用成员函数指针
(obj.*memberFuncPtr)(); // 输出 "Hello from MyClass!"

return 0;

}


总结

【表格】

场景 写法

普通函数指针 int (*funcPtr)(int, int) = add;

函数指针作为参数 void callFunc(void (*func)()) { func(); }

函数指针数组 int (*ops\[\])(int, int) = {add, sub, mul};

typedef 简化 typedef int (MathFunc)(int, int);
using 简化(C++11) using MathFunc = int (
)(int, int);

std::function(C++11) std::function<int(int, int)> func = add;

成员函数指针 void (MyClass::*memberFuncPtr)() = &MyClass::printMessage;

推荐

• 优先使用std::function(C++11+),因为它更灵活,支持 Lambda 和函数对象。

• 在 C 风格代码或旧版 C++ 中,可以使用传统函数指针。

• 成员函数指针语法较复杂,建议用std::function替代。

希望这个总结对你有帮助! 😊

相关推荐
小二·9 小时前
WebGPU 浏览器端跑大模型:让AI在网页里跑起来(WebLLM/Transformers.js实战)
开发语言·javascript·人工智能
小猴子爱上树9 小时前
Temu批量视频翻译Python实现方案
开发语言·python·音视频
IDIOSF9 小时前
R语言 下载安装教程(附安装包)R语言4.5安装步骤(保姆级)
开发语言·其他·r语言
乱七八糟的屋子9 小时前
LibYAML超全教程-C语言YAML解析与生成
c语言·开发语言·配置文件·yaml解析·libyaml·开源库实战
小肝一下9 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
paopaokaka_luck9 小时前
基于Springboot3+Vue3的宠物殡葬管理系统(webSocket实时通讯、接入腾讯地图、支付宝沙盒支付、Echarts图形化分析)
java·开发语言·网络·后端
j7~9 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
逝水无殇9 小时前
HTML 元素详解
开发语言·前端·html
Lhappy嘻嘻9 小时前
网络初识|基础入门:局域网广域网、IP 端口、TCP/IP 五层模型与封装解封装全过程
java·开发语言·网络·笔记·网络协议·tcp/ip
Wang's Blog10 小时前
Go-Zero基础入门1: 微服务框架与选型分析
开发语言·微服务·golang