C++函数指针详解

简介: 【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
  1. 函数指针的概念
  • 函数指针是指向函数的指针变量。在 C++ 中,函数本身不是变量,但是可以定义一个指针变量,让它指向一个函数。这样就可以通过这个指针变量来调用它所指向的函数。函数指针的类型由它所指向的函数的返回类型和参数类型决定。
  • 例如,有一个函数int add(int a, int b),它的函数指针类型应该是int (*)(int, int),这个类型表示一个指向返回值为int,参数是两个int类型的函数的指针。
  1. 函数指针的定义
  • 一般形式为:返回类型 (*指针变量名)(参数列表);
  • 例如:


int (*funcPtr)(int, int);


  • 这里定义了一个名为funcPtr的函数指针,它可以指向一个返回类型为int,有两个int类型参数的函数。


  1. 函数指针的赋值
  • 函数指针在使用之前必须先赋值,让它指向一个具体的函数。赋值的方式是将函数名(不带括号和参数)赋给函数指针。
  • 假设已经有函数int add(int a, int b)int subtract(int a, int b),可以这样赋值:


int add(int a, int b) {
       return a + b;
   }
   int subtract(int a, int b) {
       return a - b;
   }
   int (*funcPtr)(int, int);
   funcPtr = add;  // 将函数add的地址赋给funcPtr


  • 注意,函数名在表达式中使用时,会自动转换为函数的入口地址,也就是函数指针的值。


  1. 函数指针的调用
  • 可以通过函数指针来调用它所指向的函数。调用方式有两种:
  • 第一种是使用(*指针变量名)(参数列表)的形式。例如:


int result = (*funcPtr)(3, 5);  // 调用funcPtr指向的函数,这里是add函数,结果为8


  • 第二种是直接使用指针变量名(参数列表)的形式。在 C++ 中这种形式更为常用,例如:


funcPtr = subtract;
   int newResult = funcPtr(7, 4);  // 调用subtract函数,结果为3


  1. 函数指针作为函数参数
  • 函数指针的一个重要用途是作为函数的参数。这使得一个函数可以接收另一个函数作为参数,从而增加了函数的灵活性。
  • 例如,定义一个函数void calculate(int a, int b, int (*operation)(int, int)),它接受两个整数ab,以及一个函数指针operation,这个函数指针指向一个可以对两个整数进行操作的函数。


void calculate(int a, int b, int (*operation)(int, int)) {
       int result = operation(a, b);
       std::cout << "The result is: " << result << std::endl;
   }
   int main() {
       calculate(2, 3, add);
       calculate(5, 1, subtract);
       return 0;
   }


  • main函数中,calculate函数分别被调用两次,第一次传入add函数,第二次传入subtract函数,这样就可以根据传入的不同函数来执行不同的计算。


  1. 函数指针数组
  • 可以定义一个数组,数组的元素是函数指针。例如,定义一个函数指针数组来存储指向不同算术运算函数的指针:


int add(int a, int b) {
       return a + b;
   }
   int subtract(int a, int b) {
       return a - b;
   }
   int multiply(int a, int b) {
       return a * b;
   }
   int divide(int a, int b) {
       return a / b;
   }
   int (*funcArray[])(int, int) = {add, subtract, multiply, divide};


  • 可以通过索引来访问数组中的函数指针并调用相应的函数,例如:


int result1 = funcArray[0](4, 2);  // 调用add函数,结果为6
   int result2 = funcArray[2](3, 5);  // 调用multiply函数,结果为15
相关文章
|
16小时前
|
安全 网络安全 Windows
Windows应急响应-PcShare远控木马
【10月更文挑战第3天】这段文档介绍了在Windows系统中应对PcShare远控木马的紧急响应步骤。用户因在非官方平台下载软件后疑似中招而求助排查。文档详细描述了从发现异常连接和服务、定位注册表项到彻底查杀木马的过程,并强调了重启后的二次检查。最后提醒应避免非官方渠道下载软件,保持系统更新,定期备份数据,并在必要时寻求专业帮助。
19 11
|
19小时前
|
存储 PHP 开发者
探索PHP中的面向对象编程
【9月更文挑战第32天】在PHP的世界中,面向对象编程(OOP)是一块基石,它不仅塑造了代码的结构,还提升了项目的可维护性和扩展性。本文将深入浅出地介绍PHP中面向对象编程的核心概念,并通过实际代码示例,展示如何有效地应用这些概念来构建健壮的应用程序。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
16小时前
|
JavaScript
理解 Vue 的 setup 应用程序钩子
【10月更文挑战第3天】`setup` 函数是 Vue 3 中的新组件选项,在组件创建前调用,作为初始化逻辑的入口。它接收 `props` 和 `context` 两个参数,内部定义的变量和函数需通过 `return` 暴露给模板。`props` 包含父组件传入的属性,`context` 包含组件上下文信息。`setup` 可替代 `beforeCreate` 和 `created` 钩子,并提供类似 `data`、`computed` 和 `methods` 的功能,支持逻辑复用和 TypeScript 类型定义。
19 10
|
16小时前
|
运维 监控 安全
Linux_权限理解(详细PLUS)
【10月更文挑战第3天】本文介绍了Linux系统中的权限管理基础,包括文件系统对象与权限关联、权限的继承性、字符与数字表示法的解读,以及用户、组与权限的动态交互。详细解析了`chmod`命令的高级用法和权限修改的风险,探讨了SUID、SGID和Sticky Bit等特殊权限的作用机制,并提出了基于角色的权限分配和定期权限审计的最佳实践。
18 11
|
16小时前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
22 10
|
12天前
|
安全 网络安全 数据库
网络安全与信息安全:保护你的数字身份
【8月更文挑战第52天】在数字化时代,网络安全和信息安全已经成为了我们生活中不可或缺的一部分。本文将深入探讨网络安全漏洞、加密技术以及安全意识等方面的内容,以帮助读者更好地保护自己的数字身份。通过分享一些实际案例和技术知识,我们希望能够帮助读者提高对网络安全的认识,并采取有效措施来保护自己的信息安全。
50 19
|
14天前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
19小时前
|
C语言
3.1C语言基本数据类型
在C语言中,初始化变量是指为变量设定初始值,通常在声明时直接完成,例如 `int cows=32;`。应注意避免在同一语句中混合初始化与未初始化的变量,如 `int dogs, cats=94;` 这样的写法容易引起误解。此外,整型常量如21、32等在C语言中被视为int类型,但非常大的整数则不然,且带有小数点或指数的数值不属于整型常量。
18 8
|
17小时前
|
弹性计算 安全 Linux
esc使用体验心得
在我看来云服务器有以下优点:省力,不需要专门花时间去维护服务器的硬件,看服务器是否运行正常;稳定,这应该是最主要的有点;安全,做web开发最怕的当然是攻击,所以选择大厂的服务器,自然是最香的;省钱,这当然也是很重要的,尤其对于我们学生用户还是很友好的,爆赞!
|
13小时前
特殊的浮点值
特殊的浮点值