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
相关文章
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
80 4
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
56 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
40 2
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
52 3
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。
|
3月前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this-&gt;name`和`this-&gt;age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
4月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
37 1