gpt4 book ai didi

c - 指向函数的指针数组

转载 作者:太空狗 更新时间:2023-10-29 14:58:13 26 4
gpt4 key购买 nike

我需要编写一个函数来接收函数指针数组。我编写了以下代码,但目前我无法对其进行测试。

这是定义函数数组指针的正确方法吗?

typedef (*Function)(double);
void func(Function* arr);

如果我想用 [20] 声明数组的大小,我应该写:

void func(Function arr[20]);

?

谢谢你的帮助

最佳答案

首先,我常用的计算复杂类型的方法。从标识符开始,然后一次添加其余步骤:

    f          -- f
f[N] -- is an N-element array
*f[N] -- of pointers
(*f[N])() -- to functions
T (*f[N])() -- returning T

对于接受 double 参数并返回 double 值的函数的指针数组,这将是

double (*f[N])(double);

但是,请记住,在大多数上下文中,数组类型的表达式从“T 的 N 元素数组”类型“退化”为“指向 T 的指针”。当您将数组表达式作为参数传递给函数时,函数实际接收的是一个指针。因此,您的函数将接收一个类型为“指向返回 double 函数的指针的指针”的对象,而不是接收“指向返回 double 函数的指针的 N​​ 元素数组”类型的对象,或者

double (**f)(double)

所以你的函数定义看起来像

void func(double (**f)(double))
{
int i;
...
for (i = 0; f[i] != NULL; i++)
{
double x = (*f[i])((double) i);
}
}

调用者看起来像

double a(double x) {...}
double b(double x) {...}
double c(double x) {...}

void foo(void)
{
double (*list[])(double) = {a, b, c, NULL};
func(list);
}

如果你想改用 typedef,你可以使用这样的东西:

typedef double Dblfunc(double);   // typedef for function type 
typedef Dblfunc *Dblfuncptr; // typedef for function pointer type

void func(Dblfuncptr *f)
{
int i;
for (i = 0; f[i] != NULL; i++)
{
double x = (*f[i])((double) i);
...
}
}
...
void foo(void)
{
Dblfuncptr list[] = {a, b, c, NULL}; // EDIT: fixed type
func(list);
}

使用 typedef 使数组和函数参数看起来更像常规类型。就个人而言,我更喜欢使用“原始”类型,因为它明确表明我正在处理指向函数的指针,并且它显示了返回类型和参数类型。

关于c - 指向函数的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3628814/

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