gpt4 book ai didi

c - 无法向 "point to"传递 C 中的函数指针数组

转载 作者:行者123 更新时间:2023-12-02 21:46:57 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

关于c - 无法向 "point to"传递 C 中的函数指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19367267/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com