【发布时间】:2011-03-30 04:23:37
【问题描述】:
假设我在 C 中有一个指向 char 的指针数组:
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
我希望使用 qsort 对该数组进行排序:
qsort(data, 5, sizeof(char *), compare_function);
我无法提供比较功能。由于某种原因,这不起作用:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
我做了很多搜索,发现我必须在 qsort 内部使用**:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
这行得通。
谁能解释一下*(const char **)name1 在这个函数中的用法?我完全不明白。为什么是双指针?为什么我原来的功能不起作用?
谢谢,博达·赛多。
【问题讨论】:
-
data应声明为const。 -
比利,如果是const,还能排序吗?
-
是的。该数组可以不是
const,但该数组中包含的指针应该是const。不允许您修改这样的编译时常量文字(这样做是未定义的行为)。为此,您需要const char *data[5]。如果您希望数组本身也保持不变,那么您可以使用const char * const data[5]。
标签: c sorting qsort double-pointer