#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
static int cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
int main(int argc, char *argv[])
{
int j;
assert(argc > 1);
qsort(&argv[1], argc - 1, sizeof(argv[1]), cmpstringp);
for (j = 1; j < argc; j++)
puts(argv[j]);
exit(EXIT_SUCCESS);
}
私はこの部分で混乱している:型キャストのqsort関数ポインタのための
return strcmp(* (char * const *) p1, * (char * const *) p2);
は、なぜ彼らはこれをしましたか?なぜ彼らはこれをしませんでした:(const char**)
または(const char * const*)
? (const char**)
のために一度参照を解除すると、const charへのポインタを取得しませんか? 2つ目は、const charを指すconstポインタを取得しないでください。これらの両方は、strcmp()
が求めるものです:const charsを指す2つのポインタ。マニュアルページでconstポインタを指しているように見えるのは、const以外のものを指しているようですが、strcmp()
の宣言が要求しているものではないようです。たとえ法的であっても、そのパラメータに合わない関数を与えるのは良い考えのようには思えません。何か不足していますか?
最後に、なぜ次は、少なくともエラー警告は生成されません:
auto const char * const ptr3 = *(const char **) ptr1; //where ptr1 is
of the form int foo(const void * ptr).
を間接参照ptr1
は、かつて私たちのconst char型へのポインタを与えるが、constの自体ではありません。ただし、ptr3
はconstです。だから、コンパイラが警告を生成しないのはなぜですか?私は何かを逃しているのですか、それとも警告を発してはならない理由がありますか?
「auto」はCのキーワードであることを忘れてください。それを使わないでください。 C++ 11ではその用途が定義されていますが、C99ではノイズです。 –