我正在尝试熟悉 C 中的函数指针。我在网上查找并找到了几个这样的示例。然而,当我编译我的程序时(使用 GCC [版本 (Debian 12.2.0-14) 12.2.0]),即使我的代码具有与在线示例中所示几乎相同的结构,我也会收到几个错误。
例如,在C 中的函数指针如何工作?我们有以下内容。
将指针传递给另一个函数基本上是相同的:
int add2to3(int (*functionPtr)(int, int)) { return (*functionPtr)(2, 3); }
而在我的代码中,我有以下函数原型。行开头的数字指的是我的代码中的行号,并在引用 GCC 生成的错误消息时提供帮助。
28 double array_op(double array[], size_t size, double (*pfun)(double, double));
对应的函数调用如下。
54 result = array_op(values, numberOfElements, (*pfun)(a, b)); // Calculate the sum
当我编译程序时,此函数调用导致 GCC 生成以下错误消息。
ex9_2.c: In function ‘main’:
ex9_2.c:54:49: error: incompatible type for argument 3 of ‘array_op’
54 | result = array_op(values, numberOfElements, (*pfun)(a, b)); // Calculate the sum
| ~^~~~~~~~~~~~
| |
| double
ex9_2.c:28:55: note: expected ‘double (*)(double, double)’ but argument is of type ‘double’
28 | double array_op(double array[], size_t size, double (*pfun)(double, double));
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
在第 54 行中,我依次使用上面所示的形式以及
(pfun)(a, b)
、*pfun(a, b)
和 pfun(a, b)
来改变函数指针的形式。所有这些形式都导致了上面显示的错误消息。
我的理解是,原始函数(
add()
,subtract()
,multiply()
)的地址通过array_op()
传递到函数pfun
,这就是导致应用每个原始函数的原因,依次到数组 values[]
中的元素对。由于我对函数指针的使用与 stackoverflow 示例中显示的结构非常(!)相似,所以我不知道我哪里出了问题。
鉴于这是我第一次使用函数指针,这也许并不奇怪。
有人可以帮助澄清我的理解,以便我可以纠正我的代码吗?
在
result = array_op(values, numberOfElements, (*pfun)(a, b));
中,(*pfun)(a, b)
不是指向函数的指针。这是对函数的调用。正确的代码是result = array_op(values, numberOfElements, pfun);
。