2

試行錯誤の末、意図したとおりに次の文字列比較関数を qsort() で動作させることができましたが、 (const char*) キャスト式でアスタリスクが必要な理由がよくわかりません。誰かが分析して説明してもらえますか:-

int strCompare(const void *a, const void *b) {
    return strcmp((const char*)a, (const char*)b);
} 

付録:-

void findStrings(int * optionStats, char strings[][MAX_STRING_SIZE + 1], int numStrings)
{
    qsort(strings, numStrings, 21*sizeof(char), strCompare);
}

strCompare() を介して strcmp() への呼び出しをなくし、代わりに strcmp() を qsort() のパラメーターとして使用する方法はありますか?

4

4 に答える 4

3

ポインターポインターconst voidに変換する必要があり、アスタリスクはそれらがポインター型であることを示すため、アスタリスクが必要です。const char

pointer to void実際、C 言語では型を暗黙的に型に変換できるため、実際には変換は必要ありませんがpointer to T、これは C++ には当てはまりません。

于 2012-08-24T05:31:02.033 に答える
2

ここで他の人が言及しているように、ポインター型をキャストするためだけに、新しい関数を定義する必要はありません。に渡すときに関数をキャストしてqsort、警告/エラーを防ぐ方法は次のとおりです。

qsort(arr,
      sizeof(arr)/sizeof(char*),
      sizeof(char*),
      (int(*)(const void *, const void *))strcmp);
于 2012-08-24T06:17:32.393 に答える
1

の署名はstrcmp次のとおりです(別のものがありますが、これはあなたが使用しているものです):

int strcmp(const char *s1, const char *s2);

したがって、関数 (aおよびb)のパラメーターは であるため、const voidこれらのキャストを実行する必要があります。

呼び出し時にパラメーターとして使用している変数がasqsortに渡される限り、これは正しくなります。strComparechar *

于 2012-08-24T05:28:41.020 に答える
0

なぜなら

int strcmp(
   const char *string1,
   const char *string2 
);

のように定義されています。「 const char* 」としてキャストしない場合、変数「 a 」は void へのポインター型であると想定されます。入力すると理解しやすい

const void *a as const void* a

アスタリスクはデータ型に関連付けられています。

したがって、変数 "a" 全体を " const char " のデータ型へのポインターとしてキャストするには、アスタリスクも使用する必要があります。

于 2012-08-24T05:36:38.293 に答える