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的指针吗?
答案 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 *
。