- ベストアンサー
関数へのポインタ
超初心者です。 C言語を使ってsin波を生成して音を鳴らそうとしているのですが・・ネットで調べてもよくワカリマセン・・ 超初心者な私でも理解できるようなサイトを教えて下さい. また、関数へのポインタも勉強しているのですが, char *(*func)(void); といったchar 型へのポインタを返す関数へのポインタというのがあったとして,関数へのポインタは理解できたのですがさらにchar 型へのポインタとなると一体これが何を指しているのかさっぱりで・・・・ ご協力お願いします.
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★関数へのポインタについて ・『char』型ポインタを返す『関数へのポインタ』が『char *(*func)(void);』という関数で、 さらにこの関数へのポインタを返す関数はどう記述するのか?って事か? ・そらならば、typedef などで新たな型を定義してから記述すると簡単になりますよ。 サンプル: typedef char* (*RetFuncType)(void); ←char型ポインタを返す『関数へのポインタ』のタイプ typedef RetFuncType (*NewFuncType)(void); ←RetFuncType型を返す『関数へのポインタ』のタイプ //『char型へのポインタ』を返す関数 char *Func1(void) { return( "string" ); } //『Func1の関数へのポインタ』を返す関数 RetFuncType Func2(void) ←『char* (*Func2(void))(void)』でも同じ(複雑だ!) { return( Func1 ); } //『Func2の関数へのポインタ』を返す関数 NewFuncType Func3(void) ←『RetFuncType (*Func33(void))(void)』でも同じ(やっぱ複雑だ!) { return( Func2 ); } 最後に: ・関数へのポインタを返す関数定義は『typedef』を利用した方がわかりやすく簡単です。 ・『typedef』を使わないと関数定義が複雑すぎて自分でも理解できず、他人にも理解されない 暗号のような定義になってしまいます。 ・なお、関数へのポインタが理解できるのならば『初心者』ではなく『中級者』と思いますよ。 ・以上。おわり。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
sin波を生成して音を出すって昔懐かしいFM音源とかPSG音源でもいじるのですか? 関数のポインタのほうですが、関数自体へのポインタと その関数がポインタを返すので混乱しちゃったんですかね。 #include <stdio.h> int f(int x) { return x*x; } char* g(void) { return "hello"; } int main() { typedef int funci(int); typedef char * funcp(void); funci *p = f; funcp *q = g; printf("%d\n", (*p)(13)); printf("%s\n", (*g)()); return 0; } こんなんでイメージできますか?
【関数へのポインタについて】 以下のサンプルコードの内容を説明できますか? #include <stdio.h> typedef char *(*func)(void); char *a(void); char *b(void); char *c(void); int main(void) { func f[] = { a, b, c }; char n; while (1) { printf("どの関数を実行しますか?(a~c, 終了:q)->"); scanf(" %c", &n); switch (n) { case 'a': case 'b': case 'c': printf("%s\n", f[n - 'a']()); break; case 'q': return 0; default: puts("実行する関数名が正しくありません"); break; } } } char *a(void) { return "おはよう"; } char *b(void) { return "こんにちは"; } char *c(void) { return "こんばんは"; } (注)インデントのため、全角空白を使っています。
お礼
返答ありがとうございます。 中級者ですか・・・ 頑張ります。