c-qsort如何能够接受任何数组类型并对其进行排序



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;

相关内容

  • 没有找到相关文章

最新更新