- 36 名前:32 mailto:sage [2007/05/09(水) 17:49:16 ]
- >>33
ついでなので>>13をなんとなく解説してみるtest、改行制限でちと見辛い >void print0(){ printf("print0\n"); } // 表示関数の実体の定義 : >void print4(){ printf("print4\n"); } >typedef void(*voidfunc_t)(); // void型引数なし関数へのポインタ型voidfunc_tの定義 // voidfunc_t型を返す関数asdfの定義 // この関数は、引数aと引数bの内容を入れ替え、元の引数aの内容を返す >voidfunc_t*asdf(voidfunc_t*a,voidfunc_t*b){ > voidfunc_t*t=a; a=b; return b=t; >} // ↑例:a[0]=print0、a[1]=print1の場合、 // asdf(&a[0], &a[1]) を呼び出すと、戻値は関数print0()へのポインタとなり、 // 実行後はa[0]がprint1()を、a[1]がprint0()を指す事になる >int main(void){ > void(*a[5])(); // 「void型で引数なしの関数」へのポインタ5個分の配列の宣言 > voidfunc_t*(*f)(voidfunc_t*,voidfunc_t*); // voidfunc_t型関数へのポインタの宣言 > [ X ] // 何か足りない所 > f=asdf; // voidfunc_t型関数へのポインタへvoidfunc_t型関数の実体(のポインタ)を代入 // f(&a[1],&a[2]) → asdf(&a[1],&a[2]) = 実行後のa[2]へのポインタ // よって、f(&a[0],f(&a[1],&a[2])) → asdf(&a[0],&a[2]) > f(&a[2],f(&a[3],f(&a[4],f(&a[0],f(&a[1],&a[2]))))); // a[0]〜a[4]を呼び出す、設問から推測すると表示関数の筈 > for(int i=0;i<5;i++) (a[i])(); > return 0; >} なので、必要なのは void(*a[5])(); の中身、つまり「表示関数へのポインタ」の代入 いじょ、なんか間違ってたらスマヌ
|

|