You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现返回指向函数指针数组的指针的函数

函数指针数组与返回其指针的函数解析

问题背景

编写了一个返回指向含4个函数指针的数组的指针的函数,但对其工作原理、返回值接收及调用方式存疑;同时定义了直接的函数指针数组用于对比,却无法理清两者区别,困惑于两种方式下如何调用目标函数。

完整可编译代码

#include <stdio.h>
typedef unsigned int uint32;  // 补充uint32的定义,否则编译报错

uint32 (*(*Fun2Ptr(void))[4])(void);
uint32 Function_1(void);
uint32 Function_2(void);
uint32 Function_3(void);
uint32 Function_4(void);

// 直接定义:包含4个函数指针的数组
uint32(*Arrayof4FP[4])(void) = {Function_1, Function_2, Function_3, Function_4};

int main()
{
    // 接收Fun2Ptr的返回值:指向含4个函数指针的数组的指针
    uint32(*(*LocalMainArrof4FP)[4])(void) = Fun2Ptr();
    
    printf("---------------直接用数组调用--------------\n");
    printf("%u \n", Arrayof4FP[0]());  // 简化写法:函数指针可直接调用,无需解引用
    printf("%u \n", Arrayof4FP[1]());
    printf("%u \n", Arrayof4FP[2]());
    printf("%u \n", Arrayof4FP[3]());
    
    printf("-----------用返回数组指针的函数调用-----------\n");
    printf("%u \n", (*LocalMainArrof4FP)[0]());  // 先解引用得到数组,再取元素调用
    printf("%u \n", (*LocalMainArrof4FP)[1]());
    printf("%u \n", (*LocalMainArrof4FP)[2]());
    printf("%u \n", (*LocalMainArrof4FP)[3]());
    
    return 0;
}

uint32 Function_1(void) { return 1; }
uint32 Function_2(void) { return 2; }
uint32 Function_3(void) { return 3; }
uint32 Function_4(void) { return 4; }

// 返回指向含4个函数指针的数组的指针
uint32 (*(*Fun2Ptr(void))[4])(void)
{
    // 取全局数组的地址,赋值给对应类型的指针
    uint32 (*(*LocalPtrs)[4])(void) = &Arrayof4FP;
    return LocalPtrs;
}

核心概念拆解

1. 类型区别

  • 直接数组Arrayof4FP:类型是uint32(*[4])(void),即「包含4个无参、返回uint32的函数指针的数组」。在表达式中,数组名会隐式退化为指向第一个元素的指针(类型uint32(*)(void)*)。
  • 函数Fun2Ptr的返回值:类型是uint32(*(*)[4])(void),即「指向上述数组的指针」。它不是指向单个函数指针的指针,而是指向整个数组的指针,这是两者的本质差异。

2. 调用逻辑解析

  • 直接用数组调用:
    Arrayof4FP[0]等价于*(Arrayof4FP + 0),直接取数组第一个元素(函数指针),C语言中函数指针可以直接调用,无需显式解引用*,所以Arrayof4FP[0]()即可执行目标函数。
  • 用返回的数组指针调用:
    LocalMainArrof4FP是指向整个数组的指针,必须先解引用(*LocalMainArrof4FP)得到数组本身,再通过[0]取第一个函数指针,最后调用(*LocalMainArrof4FP)[0]()。

3. 代码中的简化点

原代码中(*Arrayof4FP[0])()的解引用是多余的,C允许直接用函数指针调用函数;同理(*LocalMainArrof4FP)[0]()也可以写成(*(*LocalMainArrof4FP)[0])(),但前者更简洁。

内容的提问来源于stack exchange,提问作者M_G_0xFF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:26:02