gpt4 book ai didi

c - 保存更多函数的函数指针

转载 作者:行者123 更新时间:2023-11-30 16:09:51 26 4
gpt4 key购买 nike

我正在尝试创建一个函数:

int func(int a, int b) { if (a == b) return 1; else return 0; }

然后我想创建一个函数指针,例如:

int (*ptr)(int, int);

如何动态分配 ptr 以允许它保存例如 10 个不同的函数调用?

ptr[0] = func(1, 1);
ptr[1] = func(1, 0);
...
ptr[9] = func(0, 0);

这样我就可以通过指针调用 FOR 循环内的函数,例如:

int result = 0;
for (int i = 0; i < 10; i++)
result += ptr[i];
printf ("%d\n", result);

最佳答案

函数指针保存函数地址,而不是整个未进行的函数调用。

int func(int a, int b) { if (a == b) return 1; else return 0; }
int (*ptr)(int, int) = &func;

你可以使用

(*ptr)(1,2) //call a function through a function pointer

而不是

func(1,2) //call a function directly

.

(从技术上讲,标准化 C 还允许 ptr(1,2)(*func)(1,2),或诸如 ( ***&***&*ptr)(1,2),因为常规函数调用是根据函数指针的衰减来定义的。)

要存储未进行的函数调用,您需要函数地址和参数:

struct callToIntIntInt{ int (*fn)(int, int); int arg1, arg2; };
struct callToIntIntInt calls[10];
calls[0] = (struct callToIntIntInt){ &func, 1, 1 };
calls[1] = (struct callToIntIntInt){ &func, 1, 0 };
/*...*/
calls[9] = (struct callToIntIntInt){ &func, 1, 0 };

/*...*/
int result = 0;
for (int i = 0; i < 10; i++)
result += calls[i].fn(calls[i].arg1, calls[i].arg2);
printf ("%d\n", result);

如果函数指针都相同,那么存储它们当然会浪费空间:

struct argsToIntIntInt{ int arg1, arg2; };
/*...*/
result += func(args[i].arg1, args[i].arg2);

使用您建议的语法:

ptr[0] = func(1, 1);
ptr[1] = func(1, 0);
...
ptr[9] = func(0, 0);

您将立即进行函数调用,结果将是 int (func 的返回类型),在这种情况下,ptr 可能只是 int ptr[10]; (十个 int 的数组 - 无函数指针)。

关于c - 保存更多函数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59007769/

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