C 关于作为参数传递给qsort()函数的比较函数的问题
我对Coursera进行了专门介绍,在一节课中,它解释了对给定数组排序的qsort()函数:C 关于作为参数传递给qsort()函数的比较函数的问题,c,pointers,void-pointers,qsort,pointer-to-pointer,C,Pointers,Void Pointers,Qsort,Pointer To Pointer,我对Coursera进行了专门介绍,在一节课中,它解释了对给定数组排序的qsort()函数: void qsort(void*base,size\u t nmemb,size\u t size,int(*compar)(常量void*,常量void*)) 其中,我们应该为qsort()提供四个参数—要排序的数组、数组中的元素数、数组中每个元素的大小以及指向函数的指针(compar)它接受两个const void*s并返回一个int。课程中说,我们需要编写compar函数以与qsort函数兼容,因
void qsort(void*base,size\u t nmemb,size\u t size,int(*compar)(常量void*,常量void*))代码>
其中,我们应该为qsort()提供四个参数—要排序的数组、数组中的元素数、数组中每个元素的大小以及指向函数的指针(compar)它接受两个const void*s并返回一个int。课程中说,我们需要编写compar
函数以与qsort
函数兼容,因此如果我们想要比较两个字符串,函数应该如下所示:
int compareStrings(const void * s1vp, const void * s2vp) {
// first const: s1vp actually points at (const char *)
// second const: cannot change *s1vp (is a const void *)
const char * const * s1ptr = s1vp;
const char * const * s2ptr = s2vp;
return strcmp(*s1ptr, *s2ptr);
}
void sortStringArray(const char ** array, size_t nelements) {
qsort(array, nelements, sizeof(const char *), compareStrings);
}
它说:请注意,传入的指针是指向数组中元素的指针(也就是说,它们指向数组中的框),即使这些元素本身就是指针(因为它们是字符串)。当我们从void*s转换它们时,我们必须注意将它们转换为这里的正确类型const char*const*-并适当地使用它们,否则我们的函数将以某种方式被破坏。例如,考虑下面的破译代码:
我不能真正得到的是为什么我们不把S1VP和S2VP看作指针的指针?我的意思是,既然传递给函数compareStrings
的参数是指向字符串的指针地址(指针地址),我们不应该声明s1vp和s2vp为int compareStrings(const void**s1vp,const void**s2vp)
,因为它们接收指针地址吗
换句话说,我正在将字符串数组的第一个元素的地址(实际上是一个指针)传递给s1vp。所以现在s1vp接收的是指针的地址而不是变量,所以我们应该将它声明为指向指针的指针,对吗?当我尝试这样做时,它会给我警告…Avoid*
可以指向任何数据类型。所讨论的数据类型也是指针这一事实不会改变任何事情
此外,您不能更改比较函数的签名,否则它将与qsort
期望的内容不兼容,并可能导致。“因此,现在s1vp接收的是指针地址而不是变量,”指针是变量。提示:与其仅“它给我警告”,不如发布确切的警告和使用的代码。
// BROKEN DO NOT DO THIS!
int compareStrings(const void * s1vp, const void * s2vp) {
const char * s1 = s1vp;
const char * s2 = s2vp;
return strcmp(s1, s2);
}