2

我一直在尝试将函数指针数组传递给函数。一旦进入该函数,我需要一个指向该函数指针数组的指针,但我不断收到错误消息。当它不是函数参数时,我可以做到这一点。

void (*(*PointerToFuncPtrArray)[2])(unsigned char data[], unsigned char length);
void (*FuncPtr[2])(unsigned char data[], unsigned char length) = {

    func1,
    func2,
}

void NotArguement(void)  // attempt to point to without passing as parameter
{
    PointerToFuncPtrArray = &FuncP;   // this works
}


//  attempt to pass as argument
void AsArguement((void (*ptr[])(unsigned char data[], unsigned char length))
{
   PointerToFuncPtrArray = &ptr;    // This throws error


}

这抛出...

Error   1   error C2440: '=' : cannot convert from 'void (__cdecl **[])(unsigned char [],unsigned char)' to 'void (__cdecl *(*)[2])(unsigned char [],unsigned char)'    
4

1 回答 1

5

函数参数列表中的数组声明衰减为指针声明。因此,您的函数参数未声明为数组(尽管外观具有误导性)。它被声明为指向指针的指针,这意味着在函数内部,数组类型将不可逆转地丢失。

这个简单的例子会报同样的错误

int x[2];
...
void foo(int a[2]) /* <- equivalent to `void foo(int *a)` */
{
  int (*p1)[2] = &x; /* <- OK */
  int (*p2)[2] = &a; /* <- ERROR: can't convert `int **` to `int (*)[2]` */
}
...
foo(x);

在上面的例子a中不再是一个数组。它是一个int *类型的指针,意味着它&a具有类型int **并且不能用于初始化一个类型的对象int (*)[2]

在 C 中,将数组传递给函数同时保留参数的“数组性”的唯一方法是“通过指向整个数组的指针”传递它,如

int x[2];
...
void foo(int (*a)[2])
{
  int (*p)[2] = a; /* <- OK */
}
...
foo(&x);

请注意,&运算符的应用程序从函数内部“移动”到调用点。

您的代码中的相同修改如下所示

void AsArguement(void (*(*ptr)[2])(unsigned char data[], unsigned char length))
{
   PointerToFuncPtrArray = ptr;
}

您只需要记住&在调用此函数时将运算符应用于数组参数。

于 2013-10-14T19:02:28.823 回答