2

qsortライブラリ関数を使用して構造要素の配列を並べ替えていますが、インターネットで検索中に次のリソースが見つかりました。

qsort 関数は、汎用ポインターによって型キャストする必要があることを理解しています。

ただし、次の行を取得できません。

typedef int (*compfn) (const void*, const void*);

宣言されたものと、その後の呼び出し:

qsort((void *) &array,              // Beginning address of array
      10,                           // Number of elements in array
      sizeof(struct animal),        // Size of each element
      (compfn)compare               // Pointer to compare function
 );
  1. どのようにtypedef動作していますか、つまり、正確に型定義されたものは何 int (*compfn)ですかint (compfn)?
  2. 前者の場合、呼び出しは ではない(*compfn)でしょうか?
4

3 に答える 3

8

構文:

typedef  int (*compfn)  (const void*, const void*);
  ^      ^       ^            ^          ^
  | return type  |               arguments type
  |             new type name 
  defining new type

compfnキーワードで定義typeされた新しいユーザーです。typedef

したがって、上記で説明した構文を使用するように正確に typedef int (*)(const void*, const void*);されています。comfn

宣言:

 compfn  fun; // same as: int (*fun)  (const void*, const void*);

meansfunは、型の 2 つの引数を取りconst void*、 を返す関数ポインターですint

次のような関数があるとします。

int xyz  (const void*, const void*);    

xyzにアドレスを割り当てることができますfun

fun = &xyz; 

呼び出し時qsort():

expressionでは、関数を型関数に型(compfn)compareキャストしています。compare(compfn)

疑い:

呼び出しはすべきではありません(*compfn)

いいえ、関数名ではなく型名です。

int (*compfn) (const void*, const void*);: typedefなしで書くだけの場合、型の2つの引数をcomfn返し、受け取る関数へのポインタになりますintconst void*

于 2013-07-22T08:13:19.727 に答える
3

typedef宣言は、特定の型のエイリアスを作成します。これは、宣言と定義で他の型として使用できることを意味します。

だからあなたが例えば持っているなら

typedef int (*compfn)(const void*, const void*);

compfn次に、関数ポインター宣言全体の代わりにのみを使用して、変数または引数を宣言できます。たとえば、次の 2 つの宣言は同じです。

compfn function_pointer_1;
int (*function_pointer_2)(const void*, const void*);

どちらも関数ポインター変数を作成し、唯一の違いは変数名の名前です。

typedef宣言が長くて複雑な場合、そのような宣言の記述を容易にし、読みやすくするために、 を使用するのが一般的です。

于 2013-07-22T08:16:22.577 に答える
0

関数ポインタの一種です。指されている関数は、2 つのパラメーターを返しint、受け入れconst void*ます。

于 2013-07-22T08:14:28.057 に答える