这里的直观答案,我可以说:
![“entergraph](“https://i.sstatic.net/6G8bufBM.png”)
What you know vs what qsort() knows
You know that your array is an array of char*
.
qsort()
only knows it has an array of bytes. That is why you also have to tell it how many bytes each element takes (in our example we are pretending a char*
is 4 bytes, though on modern hardware it is almost always 8), in addition to the number of elements in the array.
当qsort(>
> 然后打电话给你的比较功能时,not知道它有一系列的char*
。 它有各种各样的 by。
因此,它也不能直接通过该要素(char*
)。 因此,该要素要有一个点。 因此,第12号星号的点子是<条码>第4条要素(指数=3)的点子。
注意特性:char**
。
仅凭的简单明细表(<>/code>>)而不知(或谨慎)点码。
因此,比较职能只是指点,在职能范围内,你必须将该点变成正确点。
The comparison function (strings)
如果您的阵列是一系列扼杀(char*
s),那么:
int pstrcmp( void* ptr_to_a, void* ptr_to_b )
{
// Convert the argument to the correct type of pointer
char** ptr_to_string_a = ptr_to_a;
char** ptr_to_string_b = ptr_to_b;
// Access the pointed-to array element
char* a = *ptr_to_string_a;
char* b = *ptr_to_string_b;
return strcmp( a, b );
}
当然,我们可以将这一点简单地缩小到:
int pstrcmp( void* ptr_to_a, void* ptr_to_b )
{
return strcmp( *(char**)ptr_to_a, *(char**)ptr_to_b );
}
The comparison function (integers)
相比之下,如果我们的阵列是一系列的愤怒:
<代码>int integers [5];
然后,qsort(
>,仍然不知道这些要素是什么,并将给你一个要点的协调人。 计算单位仅为<代码>int*。
int pcmpint( void* ptr_to_a, void* ptr_to_b )
{
// Convert the argument to the correct type of pointer
int* ptr_to_int_a = ptr_to_a;
int* ptr_to_int_b = ptr_to_b;
// Access the pointed-to array element
int a = *ptr_to_int_a;
int b = *ptr_to_int_b;
if (a < b) return -1;
if (b < a) return 1;
return 0;
}
或更简明扼要:
int pcmpint( void* ptr_to_a, void* ptr_to_b )
{
if (*(int*)ptr_to_a < *(int*)ptr_to_b) return -1;
if (*(int*)ptr_to_b < *(int*)ptr_to_a) return 1;
return 0;
}
简单类型,如ger,通常会看以下,因为更容易阅读。 (汇编者可为所有这些变量制定相同的代码。)
int pcmpint( void* ptr_to_a, void* ptr_to_b )
{
int a = *(int*)ptr_to_a;
int b = *(int*)ptr_to_b;
if (a < b) return -1;
if (b < a) return 1;
return 0;
}