繁体   English   中英

C语言中的函数指针数组

[英]Array of Array of function pointers in C

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

#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中可能吗?

这是您想要的声明:

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

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

您可以像这样使用它:

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

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

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

如果要使用真正的2D数组,则必须将其全部初始化在一个位置:

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);

鉴于您的问题,我相信第一个选择就是您要寻找的东西。

如果您需要2D阵列,则可以这样做:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM