2013-08-06 202 views
1

该语法是否正确?指向C中功能的指针

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) 

回答

2

两种形式是正确的。

如果您定义了函数类型的函数参数(如第一个示例中所示),它会自动“调整”为相应的指针函数类型。

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

(这些规则仅适用于参数声明,而不是在其他情况下)。

参考:N1570(最近的2011 ISO C标准草案),第6.7.6.3,第7(用于数组)和8(用于函数)。

不可能拥有数组或函数类型的参数,因此对于相应指针类型的参数,语法是“借用的”。个人而言,我更喜欢使用指针表示法,因为它更加明确,但您至少应该理解这两种表单,因为您将在其他人的代码中看到它们。