qsort具有以下功能protype
void qsort(
void* _Base,
size_t _NumOfElements,
size_t _SizeOfElements,
_CompareFunction
);
它怎么可能对任何数组类型(int、double、char等(进行排序?qsort如何知道我要求它排序的数组类型?
这是由于比较函数在比较数组元素时将空指针强制转换为所需类型。
这是一个示范节目。
#include <stdio.h>
#include <stdlib.h>
int cmp( const void *px, const void *py )
{
int x = *( const int * )px;
int y = *( const int * )py;
return ( y < x ) - ( x < y );
}
int main( void )
{
int a[] ={5, 3, 1, 9, 8, 2, 4, 7};
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( 'n' );
qsort( a, N, sizeof( *a ), cmp );
for (size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( 'n' );
}
程序输出为
5 3 1 9 8 2 4 7
1 2 3 4 5 7 8 9
正如您在比较函数cmp
中看到的那样,传递的指针被强制转换为所需的类型。
int x = *( const int * )px;
int y = *( const int * )py;
为了遍历数组,函数qsort
以以下方式使用指针算术。最初,指针_Base
指向所传递的数组的第一个元素。例如,要将指针移动到数组的第i个元素,它会执行类似以下的操作
void *ith_element_ptr = ( char * )_Base + i * _SizeOfElements;