如何实现标准C库中的bsearch()函数?

时间:2010-01-03 03:01:21

标签: implementation c99 bsearch

有谁知道标准二进制搜索功能是如何实现的?

这是原型。

void * bsearch (const void*, const void*, size_t, size_t, int (*) (const void *, const void *) );

我真的好奇他们如何使用void指针。

3 个答案:

答案 0 :(得分:3)

我假设您有兴趣了解void *bsearch指针的使用方式,而不是实际的二进制搜索算法本身。 bsearch的原型是:

void *bsearch(const void *key, const void *base,
    size_t nmemb, size_t size,
    int (*compar)(const void *, const void *));

这里使用void *以便可以搜索任何类型。指针的解释由(用户提供的)compar函数完成。

由于指针base指向数组的开头,并且数组的元素保证是连续的,bsearch可以获得void *指向任何nmemb的指针通过执行指针运算来实现数组中的元素。例如,要获取指向数组中第五个元素的指针(假设为nmemb >= 5):

unsigned char *base_p = base;
size_t n = 5;
/* Go 5 elements after base */
unsigned char *curr = base_p + size*n;
/* curr now points to the 5th element of the array.
   Moreover, we can pass curr as the first or the second parameter
   to 'compar', because of implicit and legal conversion of curr to void *
   in the call */

在上面的代码段中,我们无法将size*n直接添加到base,因为它的类型为void *,并且未定义void *上的算术。

答案 1 :(得分:1)

参见bsearch @ Google's codesearch 对于bsearch的不同实现。

答案 2 :(得分:-1)

看看来源。如果您有VS Standard或更高版本,请参阅:

C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ crt \ src \ bsearch.c