通过反复试验,我设法得到以下字符串比较函数,以便按照我的意图使用qsort(),但我真的不明白为什么在(const char *)强制转换表达式中需要星号。有人可以解剖和解释: -
int strCompare(const void *a, const void *b) {
return strcmp((const char*)a, (const char*)b);
}
附录: -
void findStrings(int * optionStats, char strings[][MAX_STRING_SIZE + 1], int numStrings)
{
qsort(strings, numStrings, 21*sizeof(char), strCompare);
}
有没有办法通过strCompare()消除对strcmp()的调用,而只是使用strcmp()作为qsort()的参数?
答案 0 :(得分:3)
您需要一个星号,因为您想将指针转换为const void
到指针转换为const char
,星号表示它们是指针类型。
实际上你真的不需要转换,因为pointer to void
类型可以用C语言隐式转换为pointer to T
类型,而C ++则不然。
答案 1 :(得分:1)
strcmp
的签名是(还有另一个,但这是您正在使用的签名):
int strcmp(const char *s1, const char *s2);
因此,由于您的函数(a
和b
)的参数为const void
,您必须执行这些演员。
只要您在调用qsort
时用作参数的变量将strCompare
传递给char *
,这将是正确的。
答案 2 :(得分:1)
正如其他人在这里提到的那样,你不需要定义一个新函数,只需要转换指针类型。以下是将函数传递给qsort
时的方法,以防止出现任何警告/错误:
qsort(arr,
sizeof(arr)/sizeof(char*),
sizeof(char*),
(int(*)(const void *, const void *))strcmp);
答案 3 :(得分:0)
因为
int strcmp(
const char *string1,
const char *string2
);
就是这样定义的。如果不将其强制转换为“const char *”,则变量“a”应该是指向void的类型指针。如果键入
,最好理解 const void *a as const void* a
星号与数据类型相关联。
因此,要将整个变量“a”转换为指向数据类型“const char”的指针,您也必须使用星号。