1

这个语法正确吗?

cmp是指向函数的指针。我的程序中的一切正常,但是:

  1. 看 !我在函数中*声明时没有使用。cmp为什么我的代码有效?
  2. 当我用int (*cmp)一切声明它时,效果也很好。

这里发生了什么 ??

RangeTreeP createNewRangeTree(Element participateWorkers[], int arrsize,
                              int cmp(ConstElement, ConstElement))

不应该是:

RangeTreeP createNewRangeTree(Element participateWorkers[], int arrsize,
                  int (*cmp)(ConstElement, ConstElement))

?

对该createNewRangeTree函数的调用是:

createNewRangeTree(tempArr, NUM_PAR, &teacherCmpSalary)

并且teacherCmpSalary是一个看起来像这样的常规函数​​:

int teacherCmpSalary(ConstElement c1, ConstElement c2)
4

1 回答 1

2

任何一种形式都是正确的。

如果您定义一个函数类型的函数参数,就像在第一个示例中一样,它会自动“调整”为相应的指向函数类型的指针。

数组参数有一个非常相似的规则;您的参数Element participateWorkers[]完全等同于Element *participateWorkers.

(这两条规则仅适用于参数声明,不适用于其他上下文。)

参考:N1570(2011 ISO C 标准的最新草案),第 6.7.6.3 节,第 7 段(针对数组)和第 8 段(针对函数)。

不可能有数组或函数类型的参数,因此相应指针类型的参数的语法是“借用的”。

就个人而言,我更喜欢使用指针表示法,因为它更明确,但您至少应该理解这两种形式,因为您将在其他人的代码中看到它们。

于 2013-08-06T18:31:09.380 回答