一个nice tutorial on function pointers举了一个我有疑问的例子。这是一个简单的排序函数,其参数之一是一个函数。这是函数调用。正如您所看到的 (*compar) 函数有两个“const void*”争论
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
稍后调用此函数:
#include <stdlib.h>
int int_sorter( const void *first_arg, const void *second_arg )
{
int first = *(int*)first_arg;
int second = *(int*)second_arg;
if ( first < second )
{
return -1;
}
else if ( first == second )
{
return 0;
}
else
{
return 1;
}
}
int main()
{
int array[10];
int i;
/* fill array */
for ( i = 0; i < 10; ++i )
{
array[ i ] = 10 - i;
}
qsort( array, 10 , sizeof( int ), int_sorter );
for ( i = 0; i < 10; ++i )
{
printf ( "%d\n" ,array[ i ] );
}
}
我的问题是编译器如何知道“int_sorter”正在比较哪两个元素?它们没有在初始函数中调用,我认为这是因为作为参数调用的函数处理它们,但是那个函数如何知道在这个数组中我们正在比较这些 两个数字?
我也不知道什么*(int *)
方法;我怀疑这就是答案的一部分。
最佳答案
qsort()
函数负责(重复)使用正确的两个指针调用比较器函数。它们是指向传递给 qsort() 的数组的两个元素的指针。编译器不知道 int_sorter()
正在比较哪两个元素。
first = *(int *)first_arg;
表示法将 const void *
转换为 int *
,然后取消引用 >int
(读取它,因此不会违反const
约束),并将值分配给first
。 const void * 参数表示“比较器函数不应修改指针参数指向的数据”。
qsort()的设计允许它对任何类型的数组进行排序;它需要的信息都存在于界面中。
关于将参数复制到函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660630/