Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于作为参数传递给qsort()函数的比较函数的问题_C_Pointers_Void Pointers_Qsort_Pointer To Pointer - Fatal编程技术网

C 关于作为参数传递给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函数兼容,因

我对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
函数兼容,因此如果我们想要比较两个字符串,函数应该如下所示:

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接收的是指针的地址而不是变量,所以我们应该将它声明为指向指针的指针,对吗?当我尝试这样做时,它会给我警告…

A
void*
可以指向任何数据类型。所讨论的数据类型也是指针这一事实不会改变任何事情


此外,您不能更改比较函数的签名,否则它将与
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);
}