ここから本文です

回答受付中のQ&A

C言語のプログラミング問題だれか教えてください><

adgjadgj17さん

C言語のプログラミング問題だれか教えてください><

以下の関数を呼び出すmain関数を記述しろという問題です。試行錯誤しましたがコンパイルすら通りません。
main文で②の関数から返ってくる値を受け取る変数ってvoid (**x)();は違いますか?
②の行は何がなんだかわかりません。
どなたか取り敢えず②の行が何をしているか教えてください。。。><


void hoge(void) {
printf("hoge\n");
}

void (*a(void))(void){ //①
printf("a\n");
return hoge;
}

void (*(*b(void))(void))(void){ //②
printf("b\n");
return a;
}

void (*(*(*c(void))(void))(void))(void){ //③
printf ("c\n");
return b;
}

  • 質問日時:
    2014/5/5 16:18:57
  • 残り時間:
    6日間
  • 閲覧数:
    56
    回答数:
    3
  • お礼:
    知恵コイン
    25枚

この質問に回答する

回答

(3件中1〜3件)

並べ替え:回答日時の
新しい順
古い順

 

n2q37さん

『②の行が何をしているか』ですか。なるほど、確かに b 関数の戻り値の型って、これは凄いことになっていますね。

②の意味するところとしましては、まず、hoge 関数みたいに戻り値がない関数というのがありますよね。で、そのような形式の関数へのポインタというのがある。それを返すのが a 関数なのですが、その a 関数みたいな形式の関数へのポインタを返す。それが、b 関数っていうことです。

え?分からない?それで普通。分かるわけないでしょ、こんなの。説明するともっと難しくなる。コードの記述をそのまま素直に読むしかないです。普通なら typedef で逃げるところです。

さて、コンパイルすら通らないとの事で、それは辛いですね。一つの例として、以下をご覧下さい。

int main()
{
void (*(*(* const p )(void))(void))(void) = c();
void (*(* const q)(void))(void) = (*p)();
void (* const r)(void) = (*q)();
(*r)();
return 0;
}

これでコンパイルは通るし、ちゃんと動作しますからね。

あ、const ですけど、全部取り除いて構いません。個人的なこだわりです。ただ、それだけのことなので。

pyon_naniwa2001さん

>以下の関数を呼び出すmain関数を記述しろという問題です。
int main(void)
{
hoge();
a();
b();
c();
return 0;
}

foobar7979さん

「関数ポインタ」を学んでください。
http://www.c-lang.org/pointer_function.html

少しは理解できたら、typedef を使って①②③を
置換してってみれば、なんとなく見えてくると思います。

P.S.
さっきの http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1312861474...
と同じ人でしょ?
同じことです。 typedef で1歩ずつ自力置換してけば。

  • 違反報告
  • 編集日時:2014/5/5 16:30:36
  • 回答日時:2014/5/5 16:23:08

この質問に回答する

Q&Aをキーワードで検索:

PR

総合Q&Aランキング

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。

知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する