質問: {dog, cat, monkey}; ``` ・・・・? 以下のリンク先にあるように リンク内容 typedef 既存のデータ型 新しい名前; こうですよね・・・ typedef void (*a)(void); ← これが何をやっているのかわかりません。 void ----> (*a)(void) ではないと思います。 これは何という名前に変えているのですか??
回答: > > char dog(int a, double b){...} > > int cat(void){...} > > という風に定義されていて場合、これを上記と同じように配列化することは可能ですか?? > > どうすれば、できるでしょうか? > > > ポインターは要するにアドレスなのでどのような型へのポインターでも同じ語長を持っています。そこでキャストすることで異なる型へのポインターであっても配列の要素として混在させることは可能です。 ``` int foo(void) { return 1; } double bar(void) { return 1.0; } void *functions[] = { (void*)foo, (void*)bar, }; // 呼び出すとき int a = ((int (*)(void))functions[0])(); double b = ((double (*)(void))functions[1])(); ``` しかし配列で管理するということは通常は「同じ型のデータを管理する」目的であることが一般的でしょうから乱用は避けた方がよいかも知れません。とはいえ特定の目的でこうしたテクニックを用いることはあり得ると思います。こうした特殊なテクニックは「かなり低水準なことまで含めほとんど何でもできる」C言語の特徴と言えると思います。 > > typedef void (*a)(void); ← これが何をやっているのかわかりません。 > > > aという名前を「引数がなく、何も返さないような関数へのポインター型」であると宣言している文です。