私は以下のようなコードに出くわしました
qsort(array, 10, sizeof(int), sort);
ここでもソートは関数です。しかし、呼び出される関数は関数名の後にあるべきである()
、または何かが足りないという印象を常に持っていました。
これがどのように機能するのか、そしてこれらのような関数を呼び出す際の違いは何かを知りたかっただけです。ありがとう!
qsort(array, 10, sizeof(int), sort);
これにより、関数「sort」へのポインタが渡され、関数「qsort」がこの関数を呼び出すことができるようになります。
その関数は呼び出されず、関数ポインタとして渡されます。CおよびC++の関数ポインタを参照してください
C文法(たとえばC標準)を見る()
と、関数呼び出し演算子である、と書かれた演算子があることがわかります。これは、識別子(この場合は関数の名前)に適用されるという点で、配列の添え字演算子 に似ています。[]
関数の識別子の後に関数呼び出し演算子が続かない場合、識別子はその関数へのポインターを表します。これで、qsort
最後の引数は、比較関数へのポインタであることが明らかになりました。2つの要素を比較する必要があるときはいつでも、最後の引数が指す関数を呼び出します。
この例の関数はコールバック関数sort
と呼ばれ、コールバックqsort
します(数回、異なる引数を使用)。
sort
関数へのポインタを関数に渡して、関数を比較関数として使用できるようにしますqsort
。qsort
正しい構文には&
beforeが含まれている必要がありますsort
(これsort
は関数であり、ポインターではないため、参照する必要があります)が、コンパイラーはとにかくそれを「追加」します。