07/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])(); の中身、つまり「表示関数へのポインタ」の代入
いじょ、なんか間違ってたらスマヌ