当前位置:首页 > 技术 > 正文内容

深入理解 C++ 中的指针函数、函数指针与函数指针数组

访客 技术 2026年8月13日 1

指针函数 (Pointer Function)

指针函数本质上是一个函数,其特殊之处在于返回值是一个指针(即内存地址)。这种设计常用于返回动态分配的内存、数组中特定元素的地址或对象实例的引用。

基本语法:返回类型 * 函数名(参数列表)

以下示例展示了如何编写一个指针函数,用于在整数数组中查找最大值并返回其内存地址:

#include <iostream>
#include <vector>

// 指针函数:返回指向数组中最大元素的常量指针
const int* findMaxElement(const std::vector<int>& data) {
    if (data.empty()) return nullptr;
    
    const int* maxPtr = &data[0];
    for (const auto& val : data) {
        if (val > *maxPtr) {
            maxPtr = &val;
        }
    }
    return maxPtr;
}

int main() {
    std::vector<int> numbers = {12, 45, 7, 89, 23};
    const int* result = findMaxElement(numbers);
    
    if (result != nullptr) {
        std::cout << "The maximum value is: " << *result << std::endl;
    }
    return 0;
}

函数指针 (Function Pointer)

函数指针是一个指针变量,它指向代码段中的函数入口地址。通过函数指针,我们可以将函数作为参数传递,或者在运行时动态决定调用哪个函数,这是实现回调机制和策略模式的基础。

基本语法:返回类型 (*指针变量名)(参数列表)

下面的代码演示了如何使用函数指针来动态切换数学运算逻辑:

#include <iostream>

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    // 声明函数指针
    int (*operation)(int, int);
    
    // 指向加法函数
    operation = add;
    std::cout << "Addition result: " << operation(5, 3) << std::endl;
    
    // 指向乘法函数
    operation = multiply;
    std::cout << "Multiplication result: " << operation(5, 3) << std::endl;
    
    return 0;
}

为了简化复杂的函数指针声明,通常会使用 typedef 或 C++11 的 using 关键字来定义别名:

#include <iostream>

int subtract(int a, int b) { return a - b; }

// 使用 using 定义函数指针类型别名
using MathOperation = int(*)(int, int);

int main() {
    MathOperation op = subtract;
    std::cout << "Subtraction result: " << op(10, 4) << std::endl;
    return 0;
}

函数指针数组 (Array of Function Pointers)

函数指针数组是一个数组,其每个元素都是一个函数指针。这种结构非常适合用于实现状态机、命令分发器或菜单系统,可以通过索引直接调用对应的函数,从而替代冗长的 switch-caseif-else 语句。

基本语法:返回类型 (*数组名[数组大小])(参数列表)

以下示例构建了一个简易的服务控制命令分发器,利用函数指针数组根据用户输入的指令索引执行相应的操作:

#include <iostream>
#include <string>

void startService() { std::cout << "Service Started." << std::endl; }
void stopService() { std::cout << "Service Stopped." << std::endl; }
void restartService() { std::cout << "Service Restarted." << std::endl; }

using ActionFunc = void(*)();

int main() {
    // 初始化函数指针数组
    ActionFunc actions[] = {startService, stopService, restartService};
    std::string commands[] = {"start", "stop", "restart"};
    
    int choice = 1; // 模拟用户选择了 'stop' 指令
    
    if (choice >= 0 && choice < 3) {
        std::cout << "Executing command: " << commands[choice] << std::endl;
        // 通过索引调用对应的函数
        actions[choice]();
    } else {
        std::cout << "Invalid command index." << std::endl;
    }
    
    return 0;
}

在遍历函数指针数组时,也可以使用指针的指针来进行迭代,这在处理底层 C 风格 API 时较为常见:

#include <iostream>

void taskA() { std::cout << "Task A" << std::endl; }
void taskB() { std::cout << "Task B" << std::endl; }

using TaskFunc = void(*)();

int main() {
    TaskFunc tasks[] = {taskA, taskB};
    TaskFunc* ptr = tasks;
    
    for (int i = 0; i < 2; ++i, ++ptr) {
        (*ptr)();
    }
    return 0;
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。