• 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

在 C/C++ 中,“函数指针”和“指针函数”是两个容易混淆但含义完全不同的概念。它们的名称顺序不同,语义也截然相反。下面详细解释两者的区别:


一、指针函数(Pointer Function)—— 返回指针的函数

✅ 正确理解:

“指针函数” = 返回值是指针的函数

它本质上是一个普通函数,只是它的返回类型是指针

语法格式:

类型* 函数名(参数列表);

示例:

// 返回 int* 类型的函数
int* createArray(int size) {
    return new int[size];
}

// 返回 char* 的函数
char* getName() {
    return const_cast<char*>("Alice");
}
  • createArray 是一个函数,调用它会返回一个 int* 指针。
  • 这类函数很常见,比如 malloc()strstr() 等标准库函数。

记忆技巧

“指针函数” → 函数,其返回值是指针


二、函数指针(Function Pointer)—— 指向函数的指针

✅ 正确理解:

“函数指针” = 指向函数地址的指针变量

它是一个指针变量,只不过这个指针指向的是一个函数的入口地址

语法格式:

返回类型 (*指针变量名)(参数列表);

注意:(*p) 的括号不能省略,否则就变成了“指针函数”。

示例:

// 定义一个函数
int add(int a, int b) {
    return a + b;
}

// 声明一个函数指针,指向返回 int、接受两个 int 参数的函数
int (*funcPtr)(int, int) = add;

// 调用
int result = funcPtr(3, 4); // 等价于 add(3, 4)

也可以通过 typedef 简化:

typedef int (*Operation)(int, int);
Operation op = add;

用途

  • 回调函数(如 qsort、事件处理)
  • 实现策略模式、状态机
  • 动态选择函数执行

记忆技巧

“函数指针” → 指针,它指向一个函数


三、对比总结

项目 指针函数 函数指针
本质 函数 指针变量
返回值/类型 返回一个指针(如 int* 指向一个函数(如 int (*)(int,int)
声明示例 int* func(int x); int (*p)(int, int);
关键词重心 “函数” —— 强调这是一个函数 “指针” —— 强调这是一个指针
是否可赋值 函数名不可赋值(地址固定) 指针变量可以重新指向其他函数

四、常见错误与辨析

❌ 错误写法(混淆):

int *func(int, int);   // 这是指针函数(返回 int*)
int (*func)(int, int); // 这是函数指针(指向返回 int 的函数)

只差一对括号,意义完全不同!

✅ 快速判断方法:

看名字附近:

  • 如果 * 紧跟函数名,且没有括号包围指针函数
    char* getName(); // getName 是函数,返回 char*
    
  • 如果 *括号包围,如 (*p)函数指针
    char (*p)(); // p 是指针,指向返回 char 的函数
    

五、扩展:C++ 中的现代替代(推荐)

在 C++11 及以后,可以用更安全、灵活的方式替代原始函数指针:

  • std::function<int(int, int)>:可存储函数、lambda、bind 对象等。
  • Lambda 表达式:直接定义匿名函数。
#include <functional>
std::function<int(int, int)> f = [](int a, int b) { return a + b; };

但理解原始函数指针对阅读旧代码、系统编程仍非常重要。


✅ 总结一句话:

“指针函数”是返回指针的函数;“函数指针”是指向函数的指针。
名字顺序决定重心:“指针函数” → 函数;“函数指针” → 指针。

掌握这个区别,就能避免常见的声明和使用错误!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐