1

以下のコードはここから取得したものです。

* qsort example */
#include <stdio.h>
#include <stdlib.h>

int values[] = { 40, 10, 100, 90, 20, 25 };

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare);
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}

シグニチャにパラメータを含むcompare関数がありますが、qsortで呼び出すと、引数は渡されません。の値はどのように関数ab渡されますか?ありがとう

4

3 に答える 3

4

この式のコンテキストでは:

qsort (values, 6, sizeof(int), compare);

関数を識別する部分式compareは、(関数呼び出しではなく)その関数へのポインターに減衰します。コードは実質的に次のものと同等です。

qsort (values, 6, sizeof(int), &compare);

これは、関数の引数として使用されたときに配列に発生することとまったく同じです(これは、以前に見たことがあるかどうかはわかりませんが、より頻繁に尋ねられます)。

void f( int * x );
int main() {
   int array[10];
   f( array );      // f( &array[0] )
}
于 2012-07-05T22:18:46.267 に答える
3

qsortを呼び出すときは、関数へのポインターを渡すため、パラメーターを指定しません。

qsort実装内では、「values」配列から値を選択し、「compare」関数を呼び出します。このようにして、「a」と「b」が渡されます。

于 2012-07-05T22:16:15.293 に答える
1

qsort比較する配列内のアイテムのアドレスを渡します。たとえば、&values[3]および&values[5]

配列内のアイテムの実際のタイプを実際には知らないため、sizeパラメーターを使用してアドレスを正しく計算します。たとえば、この実装を参照してください:http: //insanecoding.blogspot.ie/2007/03/quicksort.html

于 2012-07-05T22:15:02.627 に答える