私は、プログラムを最初に実行するときにコマンドラインから引数を渡さなければならないmain関数を以下に宣言しました。その後、*argv[]
の文字列入力配列を取り、のqsort関数を使用してそれらをソートし、最後にファイル名以外のすべての要素を入力配列に出力します。 qsort
に渡さ"qsort"へのこの配列の受け渡しはどのように機能しますか?
int main(int argc,char *argv[]){
qsort(argv,args,sizeof(*argv),comp_func);
for(int U=1;U<argc;U++)printf("%s\n",argv[U]);
}
comp_func
機能を以下に示します。
int comp_func(char*a,char*b){
return strcmp(*(char **)a,*(char **)b);
}
私が知りたいのですがどのようなここで何が起こっているのですか?私はかなりqsort
配列の各2長さの並べ替えを与えられたコンパレータ関数に送信します。両方ともargv
は文字列の配列なので、この場合は文字列です。しかし、私が得ることはありませんが、ここで何が起こっているかである。
strcmp(*(char **)a,*(char **)b)
*(char **)a
は何をしているのですか? char[]
の任意の文字列へのポインタの配列を作成するだけです。その最初の値にa
が割り当てられます。その後、最終的に参照解除され、最終的に文字列a
が返されます。もしそうなら、それではなぜ普通の古き良きものはありませんa
?また、面白いことに、printf
が普通のa
の場合、??O_?
のようなランダムな文字列が出力されます。しかし、代わりに*(char **)a
を印刷すると、実際の文字列が入力されます。何故ですか?私はC
の初心者ですので、もう質問があれば私にご負担ください。
それから、私はcomp_funcの署名が間違っていると思います。配列の各要素はchar *型であるため、キャストは間違った署名を補償しています。 –
@ S.C.Madsen「署名」とはどういう意味ですか?申し訳ありませんが、それは愚かな質問のように見えるかもしれませんが、再び、私は 'C'のちょうど初心者なので、私はまだすべての条件を知っていません。 –
私の答えは「署名」を参照してください。 comp_funcのパターンは、通常、(** a、** b)または「ポインタへのポインタ」をとります。最も一般的なのはvoid *で、これは基本的に汎用ポインタと呼ばれ、ポインタが実際に指しているものを定義する "キャスト"に依存します – softwarenewbie7331