2010-11-09 73 views
4

qsort(3)庫例程的聯機幫助頁提供了一個將在命令行中作爲參數給出的單詞進行排序的示例。比較功能如下:qsort(3)的manpage是正確的嗎?

static int 
     cmpstringp(const void *p1, const void *p2) 
     { 
      /* The actual arguments to this function are "pointers to 
       pointers to char", but strcmp(3) arguments are "pointers 
       to char", hence the following cast plus dereference */ 

      return strcmp(* (char * const *) p1, * (char * const *) p2); 
     } 

但是這裏排序的是argv的元素。現在argv是一個指向字符指針的指針,它可以被看作是指向字符的指針表。

因此,它的元素是指向字符的指針,所以cmpstringp的實際參數不應該是指向字符的指針,而不是「指向char指針的指針」?

+1

如果你正在整理一個整數數組,你會希望將'const void * p1'轉換爲'int',而不是'const int *'?那麼10KB結構的數組呢,其中的元素要大得多以至於void *可能會是什麼呢? – 2010-11-09 22:31:35

+0

從該代碼開始工作以瞭解發生的事情是完全合理的,但您可能需要重新考慮問題的標題。我的意思是,你是否意識到手冊頁和代碼已經存在多久? *許多*眼球如何吸引他們? – dmckee 2010-11-10 00:01:56

回答

7

將作爲參數傳遞給qsort()的回調函數與作爲參數調用指向兩個值進行比較。如果對char *(例如argv[])的數組進行排序,則值爲char *(指向char的指針),並且比較函數將接收指向這些值的指針,即指向指向char的指針的指針。

0

沒有,因爲想必你會打電話qsort如下:

qsort(&argv[0], argc, sizeof(char*), cmpstringp); 

即你傳遞一個指針到元素,元素是const char *

2
 
strcmp(* (char * const *) p1, * (char * const *) p2) 
     ^^^^^^^^^^^^^^^^^^^^^ 

p1所以是* (char * const *)型的或通過移除*的(char * const);和char *const是分配兼容char *,所以沒問題:-)