【C++八股】什么是函数指针,如何定义和使⽤场景

ops/2025/2/12 11:34:12/

函数指针是指向函数的指针变量,它存储的是一个函数的地址,允许通过指针间接调用函数。使用函数指针可以动态地选择和调用函数,或者将函数作为参数传递给其他函数。

1. 函数指针的定义

函数指针的定义与普通指针稍有不同。它需要声明指向特定类型函数的指针。

基本格式

返回类型 (*指针名称)(参数类型);

示例:

int add(int a, int b) {return a + b;
}//定义指向该函数的指针:
int (*func_ptr)(int, int);
  • int 是函数返回的类型。
  • (*func_ptr) 是指针变量的声明。
  • (int, int) 是该函数的参数类型。

2. 使用函数指针

定义完函数指针后,可以通过指针调用对应的函数。

指针赋值:

func_ptr = &add;  // 或直接:func_ptr = add;

通过指针调用函数:

int result = func_ptr(3, 4);  // 相当于 add(3, 4)
std::cout << "Result: " << result << std::endl;

完整代码示例

#include <iostream>// 定义函数
int add(int a, int b) {return a + b;
}// 定义函数指针
int (*func_ptr)(int, int);int main() {// 赋值函数指针func_ptr = &add;// 使用函数指针调用函数int result = func_ptr(3, 4);std::cout << "Result: " << result << std::endl;  // 输出:Result: 7return 0;
}

3. 函数指针的应用场景

(1) 回调函数(Callback Functions)

函数指针常用于实现回调函数机制。在很多库中,回调函数是传递给函数的指针,用于在某些条件下调用回调函数。

例子:

例如,一个排序函数可以接受一个回调函数,来决定排序的规则:

#include <iostream>
#include <algorithm>
#include <vector>// 定义一个回调函数
bool compare(int a, int b) {return a < b;
}// 排序函数接受一个函数指针
void sortArray(std::vector<int>& arr, bool (*cmp)(int, int)) {std::sort(arr.begin(), arr.end(), cmp);  // 使用回调函数来排序
}int main() {std::vector<int> arr = {5, 3, 8, 1, 2};// 传递回调函数指针sortArray(arr, compare);for (int num : arr) {std::cout << num << " ";  // 输出排序后的数组:1 2 3 5 8}return 0;
}

(2) 实现策略模式(Strategy Pattern)

策略模式是一种行为设计模式,允许在运行时选择不同的算法(函数)。函数指针可以作为策略的一部分,根据不同情况选择不同的函数执行。

#include <iostream>// 定义不同的操作
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }// 使用函数指针作为策略
int operate(int a, int b, int (*operation)(int, int)) {return operation(a, b);
}int main() {int result1 = operate(5, 3, add);      // 使用加法策略int result2 = operate(5, 3, multiply); // 使用乘法策略std::cout << "Addition: " << result1 << std::endl;   // 输出:Addition: 8std::cout << "Multiplication: " << result2 << std::endl;  // 输出:Multiplication: 15return 0;
}

(3) 动态加载函数

函数指针可以实现动态加载函数,根据不同的条件加载不同的函数。这个应用场景在插件系统或者需要动态决定调用哪些函数的情况下非常有用。

#include <iostream>// 定义两个函数
void greetMorning() {std::cout << "Good morning!" << std::endl;
}void greetEvening() {std::cout << "Good evening!" << std::endl;
}int main() {void (*greetFunc)();// 根据用户输入动态选择函数int choice;std::cout << "Enter 1 for morning, 2 for evening: ";std::cin >> choice;if (choice == 1) {greetFunc = greetMorning;} else {greetFunc = greetEvening;}greetFunc();  // 调用选择的函数return 0;
}

(4) 函数作为参数

函数指针还可以作为函数参数,将一个函数传递给另一个函数。这个场景可以用于算法抽象事件处理等场景。

例子:
#include <iostream>void printMessage(const std::string& message) {std::cout << message << std::endl;
}// 函数接受一个函数指针作为参数
void executeFunction(void (*func)(const std::string&), const std::string& msg) {func(msg);
}int main() {executeFunction(printMessage, "Hello, world!");  // 使用函数指针调用return 0;
}

4. 总结

函数指针的关键点

  1. 定义返回类型 (*指针变量)(参数类型);
  2. 使用:通过函数指针调用函数(*func_ptr()),可以动态决定调用哪个函数。
  3. 应用:回调函数、策略模式、动态加载、事件处理等。

5.函数指针和指针函数的区别

  • 函数指针:是指向函数的指针,允许通过指针调用不同的函数,通常用于回调函数、动态函数选择等场景。
  • 指针函数:是返回指针的函数,通常用于返回数组、指向堆内存的指针等用途。


http://www.ppmy.cn/ops/157759.html

相关文章

Python 鼠标轨迹 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

Web3 的未来:从技术变革到社会经济影响的深度思考

随着互联网技术的不断演进&#xff0c;我们正站在一个新的技术革命的门槛上——Web3。Web3 不仅仅是技术的迭代&#xff0c;它预示着一场深刻的社会经济变革。本文将探讨 Web3 的核心特征、技术基础以及它可能带来的社会经济影响 Web3 的核心特征与技术基础 Web3 的核心在于去…

android的ViewModel这个类就是业务逻辑层吗

android的ViewModel这个类就是业务逻辑层吗&#xff1f; 相似&#xff1a;业务逻辑代码应该放在ViewModel这个类吗&#xff1f; 嗯&#xff0c;我现在在学习Android架构组件&#xff0c;特别是ViewModel。用户问ViewModel是否就是业务逻辑层&#xff0c;我需要仔细思考这个问题…

【Python深入浅出】Python3正则表达式:开启高效字符串处理大门

目录 一、正则表达式基础入门1.1 什么是正则表达式1.2 正则表达式的语法规则1.3 特殊字符与转义 二、Python 中的 re 模块2.1 re 模块概述2.2 常用函数与方法2.2.1 re.match()2.2.2 re.search()2.2.3 re.findall()2.2.4 re.sub() 2.3 修饰符&#xff08;Flags&#xff09;的使用…

APL语言的云计算

APL语言的云计算&#xff1a;一种灵活而高效的编程方式 引言 随着信息技术的迅猛发展&#xff0c;云计算已经成为现代计算的重要组成部分。云计算不仅带来了计算资源的高效利用&#xff0c;也引发了新一轮的技术革命。在这个背景下&#xff0c;APL&#xff08;A Programming …

人工智能学习(七)之神经网络

目录 一、引言 二、经典神经网络回顾 &#xff08;一&#xff09;结构与计算过程 &#xff08;二&#xff09;局限性 三、循环神经网络&#xff08;RNN&#xff09;原理 &#xff08;一&#xff09;基本结构 &#xff08;二&#xff09;计算过程 &#xff08;三&#xf…

DeepSeek-VL2 后训练版本的网络架构

DeepSeek-VL2 后训练版本的网络架构 flyfish 通过视觉模块提取图像特征&#xff0c;投影模块将视觉特征映射到与语言模块兼容的特征空间&#xff0c;语言模块则结合视觉和文本信息进行因果语言建模。同时&#xff0c;使用 PEFT 和 LoRA 技术进行参数高效微调&#xff0c;以及…

MIPI 详解:C-PHY

提示&#xff1a;本文基于 MIPI Specification for C-PHY Version 1.2 – 26 November 2016 文章目录 简介C-PHY 概述PHY 功能概述Lane 信号状态概述高速模式下符号的表示高速信号状态表示 体系结构Lane 模块主机和从机高频时钟产生通道和物理协议接口可选择的通道选项 Global …