gpt4 book ai didi

c - 用于 qsort 的指针转换

转载 作者:太空狗 更新时间:2023-10-29 15:24:49 25 4
gpt4 key购买 nike

这段代码片段是从我正在阅读的一本书中手抄的:

/* scmp: string compare of *p1 and *p2 */
int scmp(const void *p1, const void *p2)
{
char *v1, *v2;
v1 = *(char **) p1;
v2 = *(char **) p2;

return strcmp(v1, v2);
}

此函数与 qsort 一起用于对字符串数组进行排序。我不明白的一点是,为什么 v1 = *(char **) p1; 而不是 v1 = (char *) p1; 或者甚至不会这项工作; v1 = p1;?我想编译器应该自动对该分配进行类型转换。甚至,考虑一下:

/* scmp: string compare of *p1 and *p2 */
int scmp(const void *p1, const void *p2)
{
return strcmp(p1, p2);
}

我认为(我可能完全错了)编译器应该将 p1p2 类型转换为 char * 因为它是 strcmp(char *, char *) 期望。

综上所述,问题是为什么 v1 = *(char **) p1

最佳答案

qsort 向比较函数传递一个指向它必须比较的元素的指针;因为在 C 中没有模板,这个指针只是被粗暴地转换为 const void *(void * 在 C 中只是意味着“这是某种指针”,并且要对其执行某些操作,您必须将其转换回其实际类型)。

现在,如果您要对字符串数组进行排序,则必须比较的每个元素都是一个 char *;但是 qsort 向比较函数传递了一个指向每个元素的指针,所以您的 scmp 接收到的实际上是一个 char **(指向字符串第一个字符的指针),转换为 const void *,因为比较函数的签名如此说明。

因此,要获取您的 char *,您必须首先将参数转换为它们的实际类型 (char **),然后取消引用此指针以获取您要比较的实际 char *

(不过,从 const 正确性的角度来看,转换为 const char ** 会更正确)

关于c - 用于 qsort 的指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com