【问题标题】:Array of Array of function pointers in CC语言中的函数指针数组
【发布时间】:2014-01-09 12:21:14
【问题描述】:

目前我正在使用函数指针数组。但我需要将其扩展为函数指针数组。伪代码如下:

#include<stdio.h>


int  AnalogValue1( int a)
{
    printf("\nF: AV1 %d", a);
    return 1;
}


int  AnalogValue2( int a)
{
    printf("\nF: AV2 %d", a);
    return 1;
}

int  BinaryValue1( int a)
{
    printf("\nF: BV1 %d", a);
    return 1;
}


int  BinaryValue2( int a)
{
  printf("\nF: BV2 %d", a);
  return 1;
}
int ( *Read_AV_Props[] )(int a)
=
{
 &AnalogValue1,
 &AnalogValue2,
};

int ( *Read_BV_Props[] )(int a) =
{
 &BinaryValue1,
 &BinaryValue2
};

void main()
{
    Read_AV_Props[0](55);   
    //*(Read_Ob_Props[0])(20);

}

这里需要一组函数指针数组,以便它可以获取Read_BV_Props和Read_AV_Props的地址。从主代码中,我可以调用该函数指针数组。这在C中可能吗?

【问题讨论】:

    标签: c arrays pointers multidimensional-array function-pointers


    【解决方案1】:

    这是你想要的声明:

    int (**myArray[])(int) = {
        Read_AV_Props,
        Read_BV_Props
    };
    

    这是一个指针数组,指向接收int 并返回int 的函数。它不是真正的二维数组,因为Read_AV_PropsRead_BV_Props 衰减为指向它们的第一个元素的指针,即指向接收int 并返回int 的函数的指针。

    你可以这样使用它:

    int a = (**(myArray[i]+j))(1);
    

    或者,由于数组到指针的衰减规则(在表达式中),您也可以使用:

    int a = (*myArray[i][j])(1);
    

    如果你想要一个真正的二维数组,你必须在一个地方初始化它:

    int (*myArray[][])(int) = {
        { &binaryValue1, &binaryValue2 },
        { ... }
    };
    

    用法类似。

    或者你可以创建一个指针数组,指向函数接收int并返回int的指针数组:

    int (*(*myArray[])[sizeof(Read_AV_Props)/sizeof(*Read_AV_Props)])(int) = {
        &Read_AV_Props,
        &Read_BV_Props
    };
    

    但这假设Read_AV_PropsRead_BV_Props 具有相同的大小。

    您可以将其用于:

    int a = (*(*myArray[i])[j])(1);
    

    鉴于您的问题,我相信第一个选项就是您要寻找的。​​p>

    【讨论】:

    • 谢谢,您的第一组代码完全匹配,但正如您所说,它正在衰减到列表的第一个指针......
    • @GinuJacob 不客气。好问题顺便说一句,我喜欢这个指针的东西;)
    【解决方案2】:

    如果你需要一个二维数组,那么你可以这样做:

    #include <stdio.h>
    #include <stdlib.h>
    
    int func1(int a)
    {
        return a*2;
    }
    
    int func2(int a)
    {
        return a*3;
    }
    
    typedef int (*FunctionPtrType)(int a);
    
    FunctionPtrType myArray[2][2] =
    {
        // func1, func2
     { func1,  func2, },
     { func2,  func1, }
    };
    
    int main()
    {
        int i;
        printf("func1 = %p\n", func1);
        printf("func2 = %p\n", func2);
    
        for(i = 0; i < 2; i++)
        {
            printf("%p\n", myArray[0][i]);
            printf("%p\n", myArray[1][i]);
        }
    
        return 0;
    }
    

    【讨论】:

    • 他的问题不是如何使用他声明的数组。他想创建一个新数组,其元素为Read_AV_PropsRead_BV_Props
    • 我的问题不完全是函数指针数组。我想要一个函数指针数组..
    • 对不起,我当时误解了这个问题。我收回我的回答。
    猜你喜欢
    • 2021-09-22
    • 2013-06-09
    • 1970-01-01
    • 2022-11-10
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多