函数指针编译不干净

问题描述 投票:0回答:1

我正在尝试熟悉 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 示例中显示的结构非常(!)相似,所以我不知道我哪里出了问题。

鉴于这是我第一次使用函数指针,这也许并不奇怪。

有人可以帮助澄清我的理解,以便我可以纠正我的代码吗?

c pointers function-pointers
1个回答
0
投票

result = array_op(values, numberOfElements, (*pfun)(a, b));
中,
(*pfun)(a, b)
不是指向函数的指针。这是对函数的调用。正确的代码是
result = array_op(values, numberOfElements, pfun);

© www.soinside.com 2019 - 2024. All rights reserved.