解析和解释(const char *)在此字符串比较函数中强制转换C.

时间:2012-08-24 05:22:46

标签: c casting

通过反复试验,我设法得到以下字符串比较函数,以便按照我的意图使用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()的参数?

4 个答案:

答案 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);

因此,由于您的函数(ab)的参数为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”的指针,您也必须使用星号。