標準のバイナリ検索機能がどのように実装されているか知っている人はいますか?
これが原型です。
void * bsearch (const void*, const void*, size_t, size_t, int (*) (const void *, const void *) );
彼らが void ポインターをどのように使用したかについて、私は本当に興味があります。
標準のバイナリ検索機能がどのように実装されているか知っている人はいますか?
これが原型です。
void * bsearch (const void*, const void*, size_t, size_t, int (*) (const void *, const void *) );
彼らが void ポインターをどのように使用したかについて、私は本当に興味があります。
実際の二分探索アルゴリズム自体ではなく、で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
のポインターを取得できます。たとえば、配列の5番目の要素へのポインタを取得するには(仮定):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 *
のさまざまな実装については、bsearch @ Google の codesearchを参照してくださいbsearch
。
ソースを見てください。VS Standard 以上を使用している場合は、次を参照してください。
C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\bsearch.c