C++中函数指针与指针函数
·
在 C++ 中,函数指针和指针函数是两个不同的概念,容易混淆,下面分别详细说明:
1. 函数指针(Pointer to Function)
函数指针是指向函数的指针变量,它存储的是函数的内存地址,允许通过指针调用该函数。
定义格式:
返回值类型 (*指针变量名)(参数列表);
(*指针变量名) 必须用括号括起来,否则会被解析为指针函数(因为 * 的优先级低于 ())。
示例:
#include <iostream>
using namespace std;
// 普通函数
int add(int a, int b) {
return a + b;
}
int main() {
// 定义函数指针,指向 add 函数(参数和返回值类型必须匹配)
int (*funcPtr)(int, int) = add; // 也可写成 &add,&可省略
// 通过函数指针调用函数
int result = funcPtr(3, 5); // 等价于 (*funcPtr)(3, 5)
cout << "3 + 5 = " << result << endl; // 输出:8
return 0;
}
用途:
回调函数(如排序算法中的比较函数 qsort)。
实现函数的动态调用(根据条件选择不同函数)。
函数表(用数组存储函数指针,实现类似 “多态” 的逻辑)。
2. 指针函数(Function Returning a Pointer)
指针函数是返回值为指针的函数,本质是一个函数,只是其返回结果是某个类型的指针。
定义格式:
返回值类型* 函数名(参数列表);
由于 * 的优先级低于 (),所以 函数名(参数列表) 先结合,整体表示 “返回指针的函数”。
示例:
#include <iostream>
using namespace std;
// 指针函数:返回 int 类型的指针
int* createArray(int size) {
if (size <= 0) return nullptr;
int* arr = new int[size]; // 动态分配数组
for (int i = 0; i < size; ++i) {
arr[i] = i * 10;
}
return arr; // 返回指针
}
int main() {
int* ptr = createArray(5); // 调用指针函数,接收返回的指针
if (ptr != nullptr) {
for (int i = 0; i < 5; ++i) {
cout << ptr[i] << " "; // 输出:0 10 20 30 40
}
delete[] ptr; // 释放动态内存
}
return 0;
}
注意:
避免返回局部变量的指针(局部变量在函数结束后销毁,指针会变为野指针)。
若返回动态分配的内存(如 new 或 malloc),需在外部手动释放,防止内存泄漏。
关键区别总结:
| 概念 | 本质 | 定义形式 | 核心特点 |
|---|---|---|---|
| 函数指针 | 指针变量(指向函数) | 返回值 (*指针名)(参数) | 存储函数地址,可通过指针调用函数 |
| 指针函数 | 函数(返回指针) | 返回值* 函数名(参数) | 执行后返回一个指针类型的值 |
记住一个简单的区分方法:看 * 与函数名的结合方式,被括号括起来的 (*名) 是函数指针,否则是指针函数。
更多推荐
所有评论(0)