关于qsort中cmp函数的字符数组指针与二级指针问题咨询
qsort排序字符串数组的cmp函数疑问解答
//Sort character array lexicographically (main code): char* words[MAX_SIZE]; qsort(words, len, sizeof(char*), cmp); int cmp(const void* w1, const void* w2) { char** str1 = w1; char** str2 = w2; return strcmp(*str1, *str2); //return strcmp(w1, w2); }
为什么必须用二级指针,不能直接返回strcmp(w1, w2)?
- qsort的工作逻辑是:把你传入的数组(这里是
words)当成连续的元素集合,每次调用cmp函数时,会传入指向两个待比较元素的指针。 - 你的
words是char*类型的数组,每个元素是一个指向字符串的指针(char*)。所以qsort传给cmp的w1和w2,本质是指向这些char*元素的指针,也就是char**类型(二级指针)。 strcmp函数要求的参数是指向字符串首字符的指针(char*),如果直接传w1和w2,相当于把char**类型的指针强转成char*传给strcmp,这时候strcmp会把w1本身的地址当成字符串的起始地址去读取,完全不是你要比较的目标字符串,自然会出错。
你的理解是否正确?
完全正确。w1和w2确实是指向words[i](字符串首指针)的指针,属于二级指针,必须通过解引用*str1、*str2拿到真正的字符串指针,才能交给strcmp做字典序比较。
内容的提问来源于stack exchange,提问作者Borges
相关产品推荐
相关产品推荐

