在 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),需在外部手动释放,防止内存泄漏。

关键区别总结:

概念 本质 定义形式 核心特点
函数指针 指针变量(指向函数) 返回值 (*指针名)(参数) 存储函数地址,可通过指针调用函数
指针函数 函数(返回指针)  返回值* 函数名(参数) 执行后返回一个指针类型的值

记住一个简单的区分方法:看 * 与函数名的结合方式,被括号括起来的 (*名) 是函数指针,否则是指针函数。

Logo

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

更多推荐