2

C リファレンスによると、標準ライブラリで提供される qsort 関数の形式は次のとおりです。

void 
qsort ( void * base, size_t num, size_t size, int ( * compar ) ( const void *, const void * ) );

私の質問は、比較関数がフォームに引数を持たなければならない理由と、const void *それが何を意味するかですconst void *

別の質問は、関数が形式の引数を取る場合、const void *このポインターが指す値を変更できるかということです。

例:

static int double_a_number(const void * val){
    *(int *)val = *(int *)val * 2;
    return 0;
}

これは本当に変数 val を 2 倍にしますか?

手伝ってくれてありがとう!

4

1 に答える 1

3

比較関数が次の形式で引数を持たなければならない理由const void *

これは、C で使用できる最も一般的な型だからです。任意のqsort型の配列の並べ替えに使用できることを覚えておいてください。

別の質問は、関数が形式の引数を取る場合、const void *このポインターが指す値を変更できるかということです。

をキャストしないわけではありませんconst。そして、これは通常は悪い考えです (これは確かに予期せぬことであり、未定義の動作やクラッシュにつながる可能性もあります)。そして、それは確かにコンパレータ関数では意味がありません!

于 2013-01-06T17:47:14.233 に答える