如何使函数返回指向函数指针数组的指针

问题描述 投票:0回答:1

在这个后续程序中,我尝试创建一个函数,返回一个指向 4 个函数指针数组的指针,但我不知道它是如何工作的,也不知道如何调用它并接收返回值,还有一个数组4 个函数指针(使其能够提取差异,但我不能)现在我对从这些方法中的任何 2 个方法(无论是数组还是函数)调用函数的方式感到困惑。

#include <stdio.h>

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

uint32(*Arrayof4FP[4])(void) = {Function_1 ,Function_2 ,
                                Function_3 ,Function_4};

int main()
{
    uint32(*(*LocalMainArrof4FP)[4])(void) = Fun2Ptr();
    printf("---------------Array--------------\n");
    printf("%i \n" , (*Arrayof4FP[0])()); // 1
    printf("%i \n" , (*Arrayof4FP[1])()); // 2
    printf("%i \n" , (*Arrayof4FP[2])()); // 3
    printf("%i \n" , (*Arrayof4FP[3])()); // 4
    printf("-----------Using Function-------------\n");
    printf("%i \n" ,(*LocalMainArrof4FP)[0]() ); // 1
    printf("%i \n" ,(*LocalMainArrof4FP)[1]() ); // 2
    printf("%i \n" ,(*LocalMainArrof4FP)[2]() ); // 3
    printf("%i \n" ,(*LocalMainArrof4FP)[3]() ); // 4
    
    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;
}
uint32 (*(*Fun2Ptr(void))[4])(void)
{
    uint32 (*(*LocalPtrs)[4])(void) = &Arrayof4FP;
    return LocalPtrs;
}
c function pointers function-pointers
1个回答
0
投票

您不能从函数返回数组,而是返回指针。将数组移至函数并使用 static 关键字确保活力。添加了

uint32
缺少的 typedef,并使用了 inittypes.h 中的格式宏:

#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>

typedef uint32_t uint32;

uint32 Function_1(void) {
    return 1;
}

uint32 Function_2(void) {
    return 2;
}

uint32 (**Fun2Ptr(void))(void) {
    static uint32 (*fp[])(void) = { Function_1, Function_2 };
    return fp;
}

int main(void) {
    uint32 (**fp)(void) = Fun2Ptr();
    printf("-----------Using Function-------------\n");
    printf("%" PRIu32 "\n", fp[0]()); // 1
    printf("%" PRIu32 "\n", fp[1]()); // 2
    return 0;
}

和结果输出:

-----------Using Function-------------
1
2
© www.soinside.com 2019 - 2024. All rights reserved.