如何实现返回指向函数指针数组的指针的函数
函数指针数组与返回其指针的函数解析
问题背景
编写了一个返回指向含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
相关产品推荐
相关产品推荐

