C++ 函数指针

2025年5月30日 | 阅读 7 分钟

在 C++ 中,函数指针是一种指针,它指向函数而不是数据值。它允许函数作为参数传递、存储在数组中或从其他函数返回,从而实现动态函数调用和灵活的编程结构,例如回调和函数表。

C++ 中,指针用于指向某些变量;同样,函数指针是用于指向函数的指针。它主要用于存储函数的地址。我们可以使用函数指针调用函数,也可以将指针作为参数传递给另一个函数。它们主要用于事件驱动应用程序、回调,甚至用于将函数存储在数组中。

函数的地址是什么?

众所周知,计算机只理解低级语言,即二进制形式。在 C++ 中,程序中的每个函数在编译后主要存储在主内存 (RAM) 中。我们可以使用编译器将高级源代码转换为存储在可执行文件中的机器代码。此可执行文件存储在 RAM 中。CPU 从 main() 方法开始执行,它读取 RAM 中的副本而不是原始文件。

Function Pointer in C++

所有函数和机器代码指令都是数据。此数据是一堆字节,所有这些字节在 RAM 中都有一些地址。函数指针包含函数第一条指令的 RAM 地址。

函数指针的声明

以下语法显示了函数指针的声明

在这个语法中,

  • *Pointer_name: 它表示指针的名称。
  • Parameter_list: 它表示参数的列表和名称。

获取函数的地址

在 C++ 中,我们可以非常轻松地获取函数的地址。如果我们想获取函数的地址,我们只需要提及函数的名称,而不需要调用函数。

C++ 获取函数地址的示例

让我们举一个例子来说明如何在 C++ 中获取函数的地址。

示例

编译并运行

输出

Address of a main() function is : 1

说明

在上面的程序中,我们显示了 main() 函数的地址。为了打印 main() 函数的地址,我们只提到了函数的名称;没有括号,也没有参数。因此,函数名称本身,没有任何括号或参数,意味着函数的地址。

使用函数指针间接调用函数

在 C++ 中,我们可以通过简单地使用函数指针的名称,借助函数指针调用函数。通过函数指针调用函数的语法与我们通常调用函数的方式类似。

C++ 使用函数指针间接调用函数的示例

让我们举一个例子来说明如何使用函数指针间接调用函数。

示例

编译并运行

输出

value of sum is : 10

说明

在此示例中,我们声明了函数指针,即 int (*funcptr)(int,int),然后我们将 add() 函数的地址存储在 funcptr 中。这意味着 funcptr 包含 add() 函数的地址。现在,我们可以使用 funcptr 调用 add() 函数。最后,语句 funcptr(5, 5) 调用 add() 函数,add() 函数的结果存储在 sum 变量中。

将函数指针与字符串一起使用

在 C++ 中,函数指针不限于数字操作,它们也可以与任何函数签名一起使用,包括那些接受 char* 或 std::string 类型的函数。它对于处理字符串操作非常有用,包括自定义打印、解析、格式化等。

C++ 带字符串的函数指针示例

让我们举一个例子来说明 C++ 中带字符串的函数指针。

示例

编译并运行

输出

Enter the name of the person: John
Name of the person is : John

说明

在此示例中,我们定义了函数 printname(),它包含 char 指针作为参数。之后,我们声明了函数指针,即 void (*ptr)(char*)。语句 ptr=printname 表示我们将 printname() 函数的地址分配给 ptr。最后,我们可以使用语句 ptr(s) 调用 printname() 函数。

函数指针数组

在 C++ 中,函数指针数组是一个集合,其中每个元素都是指向函数的指针。它支持动态函数选择,并有助于根据索引或条件调用函数。

语法

它具有以下语法:

C++ 函数指针数组示例

让我们举一个例子来说明 C++ 中的函数指针数组。

示例

编译并运行

输出

Addition: 38
Subtract: 2
Multiply: 360

说明

在此示例中,函数指针数组操作用于存储三个算术函数:加法、减法和乘法。在数组中,每个函数指针都带两个整数参数(a 和 b)调用,这允许动态调用相应的操作。

将函数指针作为参数传递

在 C++ 中,函数指针可以作为参数传递给另一个函数,以允许动态行为。如果我们要执行此操作,我们有两种主要方法。首先,要么传递我们得到的值,其次,传递程序中已存在的函数指针。

C++ 将函数指针作为参数传递的示例

让我们举一个例子来说明如何在 C++ 中将函数指针作为参数传递。

示例

编译并运行

输出

func1 is called

说明

在此示例中,func2() 函数将函数指针作为参数。之后,main() 方法调用 func2() 函数,其中传递了 func1() 的地址。通过这种方式,func2() 函数间接调用了 func1()。

C++ 函数指针 MCQ

1) C++ 中的函数指针是什么?

  1. 它是一个存储类对象地址的指针
  2. 它是一个存储函数地址的指针
  3. 它是一个存储变量地址的指针
  4. 它是一个存储函数返回值的指针
 

答案: b) 它是一个存储函数地址的指针


2) 下列哪个选项显示了 C++ 中函数指针的正确语法?

  1. int *func(int, int);
  2. int (*funcptr)(int, int);
  3. int funcptr(int, int);
  4. int &funcptr(int, int);
 

答案: b) int (*funcptr)(int, int);


3) 下面代码的输出是什么?

  1. Tech
  2. TpointTech
  3. Tpoint
  4. Tpoint, Tech
 

答案: a) Tech


4) 以下哪个选项不是 C++ 中函数指针的正确用法?

  1. 存储在数组中
  2. 作为参数传递给另一个函数
  3. 调用构造函数
  4. 从函数返回函数
 

答案: c) 调用构造函数


5) 下面代码的输出是什么?

  1. 50
  2. 0
  3. 15
  4. 55
 

答案: d) 55


下一主题C++ 内存管理