qsort(3)的联机帮助页是对的吗?

时间:2010-11-09 22:17:09

标签: c qsort

qsort(3)库例程的联机帮助页给出了在命令行上对作为参数给出的单词进行排序的示例。比较函数如下:

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的指针吗?

3 个答案:

答案 0 :(得分:7)

作为参数传递给qsort()的回调函数被调用,作为参数,指向要比较的两个值。如果对char *数组进行排序(例如argv[]),则值为char *(指向char的指针),比较函数将接收指向此类值的指针,即指针指向char

答案 1 :(得分:2)

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

所以p1的类型为* (char * const *),或者删除* (char * const);和char *const的作业与char *兼容,所以没问题: - )

答案 2 :(得分:0)

不,因为您可能会按以下方式致电qsort

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

即。你传给一个指向元素的指针,一个元素是const char *