在 C 中将 const void * 转换为 const char *

Cha*_*Liu 1 c casting qsort

所以我有一个 C 函数,如下所示:

int cmp (const void *a, const void* b)
 return rot13cmp( (const char*)a, (const char*)b );
}
Run Code Online (Sandbox Code Playgroud)

rot13cmp 是另一个函数,它采用两个 const char * 类型的参数。

我将此函数传递给 C qsort函数的比较参数,但它似乎不起作用。

但是,如果我通过执行以下操作来转换 const void * 变量

return rot13cmp ( *(const char **)a, *(const char **)b ); 
Run Code Online (Sandbox Code Playgroud)

然后该功能开始工作。我查了一下这个,但每个消息来源都说第一种铸造方法应该有效,所以我想知道为什么只有第二种方法对我有用?

编辑:这是我的相关代码,

int cmp (const void *a, const void *b) {
 return rot13cmp( (const char *)a, (const char *)b );
}

int rot13cmp (const char *a, const char *b) {
 while (*a == *b && *a != '\n') {
  a++;
  b++;
 }

 if (*a == *b) { return 0; }
 else if (*a == '\n') { return 1; }
 else if (*b == '\n') { return 1; }
 else { return rot13(*a) - rot13(*b);
}
Run Code Online (Sandbox Code Playgroud)

rot13 返回一个 int,表示按字母表中 13 个字母旋转的字母的 ASCII 代码。

我通过这样做调用了 qsort

qsort(words, word_count, sizeof(char*), cmp);
Run Code Online (Sandbox Code Playgroud)

其中,words 是 char** 数组,word_count 是 int。cmp 也只是

sth*_*sth 5

qsort()使用指向应比较的数组元素的指针调用比较函数。

如果您的数组包含const char*,则意味着使用指向这些指针的指针调用比较函数,并且您必须相应地进行强制转换和取消引用。

您将(const char*)a参数解释为指向 的指针const char。但事实并非如此。实际上它是一个指向const char*输入数组中的指针。

这就是为什么(const char**)a正确的转换,它将参数解释为指向 的指针const char*。要进行字符串比较,您需要指向的const char*,您可以通过使用 取消引用强制转换的值来访问它*

您可以将其视为首先更正类型(通过强制转换),然后访问指向的值(通过取消引用)。

两次尝试之间的区别在于第二种情况进行了额外的取消引用。这很重要,因为qsort()不直接传递 const char*,而是传递指向它的指针。所以我们必须查看指向的值来找到我们要寻找的东西。通过直接转换为,const char*我们只是声明该变量将包含这样一个指针,这不会有好结果,因为事实并非如此。