首页 > 其他分享 >复杂类型函数指针的传递

复杂类型函数指针的传递

时间:2025-01-04 09:59:07浏览次数:3  
标签:return 函数 复杂 int 传递 add Result 函数指针

在 C 语言中,函数指针是一种非常灵活的工具,允许在运行时动态调用函数。当涉及到复杂类型的函数指针(例如多层指针、函数返回指针的指针或指针数组)时,理解如何定义、传递和使用这些函数指针非常重要。


函数指针的基本概念

  1. 函数指针的声明

    返回类型 (*函数指针名称)(参数列表);
    

    示例:

    int (*fp)(int, float); // 指向一个返回类型为 int,参数为 int 和 float 的函数指针
    
  2. 函数指针作为函数参数

    返回类型 函数名(函数指针类型);
    

    示例:

    void callFunction(int (*fp)(int, float), int x, float y);
    
  3. 函数指针数组

    返回类型 (*函数指针数组名称[大小])(参数列表);
    

    示例:

    int (*fpArray[3])(int); // 一个大小为 3 的数组,每个元素是一个函数指针
    
  4. 函数返回函数指针

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

    示例:

    int (*getFunction())(int); // 一个函数,返回一个函数指针
    

复杂类型函数指针的传递

1. 函数指针作为函数参数
示例:简单函数指针
#include <stdio.h>

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

// 定义一个函数,接收一个函数指针
void execute(int (*fp)(int, int), int x, int y) {
    printf("Result: %d\n", fp(x, y)); // 调用函数指针
}

int main() {
    execute(add, 5, 10); // 传递函数指针
    return 0;
}

输出

Result: 15

解析

  • execute 接受一个函数指针 fp,以及两个整数参数 xy
  • main 中,将函数 add 的地址传递给 execute

2. 函数指针数组作为参数
示例:函数指针数组
#include <stdio.h>

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

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

// 定义一个函数,接收函数指针数组
void executeArray(int (*fp[])(int, int), int x, int y) {
    for (int i = 0; i < 2; i++) {
        printf("Result[%d]: %d\n", i, fp[i](x, y)); // 调用函数指针数组中的函数
    }
}

int main() {
    // 定义函数指针数组
    int (*operations[2])(int, int) = {add, subtract};

    executeArray(operations, 10, 5); // 传递函数指针数组
    return 0;
}

输出

Result[0]: 15
Result[1]: 5

解析

  • 函数指针数组 operations 包含两个函数 addsubtract
  • executeArray 函数遍历数组并调用其中的函数。

3. 返回函数指针的函数
示例:返回函数指针
#include <stdio.h>

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

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

// 定义一个函数,返回一个函数指针
int (*getOperation(char op))(int, int) {
    if (op == '+') {
        return add;
    } else {
        return subtract;
    }
}

int main() {
    char op = '+';
    int (*operation)(int, int) = getOperation(op); // 获取函数指针

    printf("Result: %d\n", operation(10, 5)); // 调用返回的函数指针
    return 0;
}

输出

Result: 15

解析

  • getOperation 根据参数 op 返回对应的函数指针。
  • main 中,通过调用 getOperation 获取指向 add 的函数指针,并调用它。

4. 多级函数指针
示例:指向函数指针的指针
#include <stdio.h>

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

int main() {
    int (*fp)(int, int) = add;    // 定义函数指针
    int (**fpp)(int, int) = &fp; // 定义指向函数指针的指针

    printf("Result: %d\n", (*fpp)(10, 20)); // 调用函数指针
    return 0;
}

输出

Result: 30

解析

  • fp 是一个函数指针,指向 add
  • fpp 是一个指向 fp 的指针,最终通过 (*fpp) 调用函数。

5. 函数返回多级函数指针
示例:函数返回函数指针的指针
#include <stdio.h>

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

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

// 定义一个函数,返回指向函数指针的指针
int (**getPointerToFunction())(int, int) {
    static int (*fp)(int, int) = add; // 静态存储的函数指针
    return &fp;
}

int main() {
    int (**fpp)(int, int) = getPointerToFunction(); // 获取函数指针的指针

    printf("Result: %d\n", (*fpp)(15, 5)); // 调用函数
    return 0;
}

输出

Result: 20

解析

  • getPointerToFunction 返回一个指向函数指针的指针。
  • main 中,通过函数指针的指针调用目标函数。

6. 综合示例:函数指针数组 + 返回函数指针

#include <stdio.h>

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

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

// 定义一个函数,返回一个函数指针数组
int (*(*getOperations()))(int, int) {
    static int (*operations[2])(int, int) = {add, subtract};
    return operations;
}

int main() {
    // 获取函数指针数组
    int (*(*fpArray))(int, int) = getOperations();

    // 使用函数指针数组
    printf("Add Result: %d\n", fpArray[0](10, 5));       // 调用 add
    printf("Subtract Result: %d\n", fpArray[1](10, 5)); // 调用 subtract

    return 0;
}

输出

Add Result: 15
Subtract Result: 5

总结

  • 函数指针和多级函数指针的使用可以灵活调用函数、实现动态绑定。
  • 复杂类型函数指针传递的关键
    1. 使用右左法则解析函数指针的声明;
    2. 函数指针可以作为参数、返回值或数组元素;
    3. 多级函数指针可以指向函数指针,从而实现更复杂的调用结构。
  • 常见场景:
    • 动态函数调用(如根据条件调用不同函数)。
    • 函数指针数组实现回调。
    • 函数返回函数指针实现更灵活的接口。

标签:return,函数,复杂,int,传递,add,Result,函数指针
From: https://blog.csdn.net/Hello__nibuhao/article/details/144918628

相关文章

  • 如何得到深度学习模型的参数量和计算复杂度
    1.准备好网络模型代码importtorchimporttorch.nnasnnimporttorch.optimasoptim#BP_36:输入2个节点,中间层36个节点,输出25个节点classBP_36(nn.Module):def__init__(self):super(BP_36,self).__init__()self.fc1=nn.Linear(2,36)#输......
  • 【Spring开发】 老板爱瞎改权限怎么办:注解+AOP 打造复杂权限体系
    引言一、权限控制的基本概念二、系统需求分析三、库表设计四、权限控制的注解设计五、切面实现六、权限控制的业务逻辑实现七、结论引言在软件开发的世界里,权限控制是确保数据安全和业务流程合规性的关键。然而,当老板或管理层频繁地调整权限设置时,这不仅会打乱开......
  • 职业生涯最复杂sql记录
    SELECTteaching_activity_comment_data.*,user_info.avatar,liveclass_relation_id.related_type,COALESCE(user_info.user_name,teaching_activity_visitor.name)asuser_name,COALESCE(user_info.login_name,teaching_activity_visitor.login_name)aslogin_nameFROM......
  • python中的序列结构《增删改查》的复杂度
    在Python中,不同的序列数据结构(如list、tuple、set、dict等)对增、删、改、查操作的时间复杂度不同。下面是对常见数据结构的总结,按操作类型(增、删、改、查)分析它们的时间复杂度:1.list(列表)查找操作(如in或index()):时间复杂度:O(n)原因:需要遍历列表,检查每个元素是否匹配......
  • [数据结构学习笔记2] 大O法表示程序的时间复杂度
    程序运行都是需要时间的,我们用大O法来表示,程序在最坏情况下,运行时间和输入规模的关系。一般有这么几种大O时间:快:闪电:O(1)-常量复杂度-和输入无关;比如通过数组下标访问元素;简单数学运算,如看末尾数字是否是基数;火箭:O(logn)-对数复杂度-时间增长随数字规模增长缓慢;这种......
  • main参数传递-1
    main参数传递-1求和函数//sum.c#include<stdio.h>intsum(intN){intsum=0;sum=sum+N;returnsum;}//main.c#include<stdio.h>#include<stdlib.h>//声明intsum(intN);intmain(intargc,char*argv[]){intcount=0,......
  • Warshall算法-有向图传递闭包
    Warshall算法用于计算有向图的传递闭包,即确定从一个顶点到另一个顶点是否存在路径。该算法通过一系列n阶布尔矩阵R(0),R(1),...,R(k),...,R(n)逐步构造出最终的传递闭包矩阵。以下是应用Warshall算法的具体步骤:算法步骤初始化:设初始矩阵R(0)为给定有向图G的邻接矩阵A,其中元素A[i]......
  • AWS开源Multi-Agent-Orchestrator:多智能体编排框架,管理AI智能体,处理复杂对话
    近期,AWS推出了一款名为Multi-AgentOrchestrator的全新开发工具,其设计目的在于简化开发人员对复杂AI交互的管理流程。这款工具具备高效的请求分配机制,能够精确地将用户请求路由至最合适的AI代理,并且能实时追踪对话状态,从而满足从基础聊天机器人到高级AI系统的多样化需......
  • 线性化注意力综述:突破Softmax二次复杂度瓶颈的高效计算方案
    大型语言模型在各个领域都展现出了卓越的性能,但其核心组件之一——softmax注意力机制在计算资源消耗方面存在显著局限性。本文将深入探讨如何通过替代方案实现线性时间复杂度,从而突破这一计算瓶颈。注意力机制基础理论本文假设读者已经熟悉ChatGPT、Claude等模型及其底层的tran......
  • 将复杂数据类型封装在字符串中
    希望得到一个数组或对象的字符串表示,以便存储在一个文件或数据库中。使用serialize()将变量及其值编码为一种文本形式://定义一个数组,其中包含食品名称作为键,食品数量作为值$pantry=array('sugar'=>'2lbs.','butter'=>'3sticks');//尝试以写入模式('w')打开一个名为'......