如何在C中输入指向char的指针数组?

bod*_*ydo 23 c sorting qsort double-pointer

假设我在C中有一个指向char的指针数组:

char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
Run Code Online (Sandbox Code Playgroud)

我希望使用qsort对这个数组进行排序:

qsort(data, 5, sizeof(char *), compare_function);
Run Code Online (Sandbox Code Playgroud)

我无法提出比较功能.由于某种原因,这不起作用:

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_);
}
Run Code Online (Sandbox Code Playgroud)

我做了很多搜索,发现我必须**在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_);
}
Run Code Online (Sandbox Code Playgroud)

这很有效.

任何人都可以解释*(const char **)name1这个功能的使用吗?我根本不明白.为什么双指针?为什么我原来的功能不起作用?

谢谢,Boda Cydo.

Ste*_*sop 21

如果它有助于将事情直接放在头脑中,那么应该在比较器中投射指针的类型与传入的数据指针的原始类型相同qsort(qsort docs调用base).但是,qsort为了通用,它只是处理所有事情void*,无论它"真正"是什么.

因此,如果您要对一组int进行排序,那么您将传入int*(转换为void*).qsort将返回void*指向比较器的两个指针,您将其转换为int*,并取消引用以获取int您实际比较的值.

现在替换intchar*:

如果你正在排序一个数组char*,那么你将传入一个char**(转换为void*).qsort将返回void*指向比较器的两个指针,您将其转换为char**,并取消引用以获取char*您实际比较的值.

在您的示例中,因为您正在使用数组,所以char**您传入的数组是char*"衰减"到指向其第一个元素的指针的数组的结果.由于第一个元素是a char*,指向它的指针是a char**.