簡體   English   中英

為什么不需要將參數傳遞給qsort比較器函數?

[英]Why don't you need to pass arguments to a qsort comparator function?

下面的代碼是從這里獲取的

* 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的值如何傳遞給函數? 謝謝

在此表達式的上下文中:

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] )
}

調用qsort時,您將傳遞一個指向該函數的指針,這就是為什么不指定任何參數的原因。

在qsort實現內部,從“值”數組中選擇值,然后調用“比較”功能。 這就是“ a”和“ b”的通過方式。

qsort傳遞要比較的數組中任何項目的地址。 例如, &values[3]&values[5]

由於它實際上並不知道數組中各項的實際類型,因此它使用size參數來正確計算地址。 例如,請參見以下實現: http : //insanecoding.blogspot.ie/2007/03/quicksort.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM