C++学习-----函数指针和指针函数
·
- 操作系统: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; };
但理解原始函数指针对阅读旧代码、系统编程仍非常重要。
✅ 总结一句话:
“指针函数”是返回指针的函数;“函数指针”是指向函数的指针。
名字顺序决定重心:“指针函数” → 函数;“函数指针” → 指针。
掌握这个区别,就能避免常见的声明和使用错误!
更多推荐


所有评论(0)