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 に答える