前提・実現したいこと
int (*(*x)(double))[3] = nullptr
ってどうゆうことですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
int (*a)[3];
という宣言は理解できますか?
「配列へのポインタ」というのがどんなものか、わかりますか。
int (*b)(double);
は大丈夫ですか?
以上がわかっていれば、その組み合わせなだけなのですが、下層がわかってないといくら説明を積み上げてもわからないでしょう。
全部説明するのもちょっと面倒なので、わからないところがあるならそこから始めます。
ちょっと余談。
'C言語 複雑なポインタ'でググってみると複雑なポインタ宣言の解釈について解説をしているページがいくつかヒットします。覗いてみるのもよろしいかと。
投稿2019/09/13 01:42
編集2019/09/13 10:39総合スコア7703
0
関数のパラメータ宣言の意味は? - stackoverrun.comと同じ問題ですかね。
引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では「配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。
コメントをくださった方ありがとうございました。今更ですが正しく理解できました。いろいろ試したつもりでしたが当初はint (*f(double x))[3]
の書式にたどり着けませんでした。
#include <stdio.h> int array[3] = { 1, 2, 3 }; int (*f(double x))[3] { return &array; } int main(void) { int (*(*x)(double))[3] = 0; int (*r)[3] = 0; printf("array : %p\n", array); printf("&array : %p\n", &array); printf("&array[0] : %p\n", &array[0]); printf("f() : %p\n", f(1.0)); printf("f : %p\n", f); printf("sizeof(x) : %zu\n", sizeof(x)); x = f; r = x(1.0); printf("x : %p\n", x); printf("x() : %p\n", r); printf("*r : %p\n", *r); printf("r[0] : %p\n", r[0]); printf("(*r)[0] : %d\n", (*r)[0]); printf("(*r)[1] : %d\n", (*r)[1]); printf("(*r)[2] : %d\n", (*r)[2]); }
result
1array : 00404004 2&array : 00404004 3&array[0] : 00404004 4f() : 00404004 5f : 00401410 6sizeof(x) : 4 7x : 00401410 8x() : 00404004 9*r : 00404004 10r[0] : 00404004 11(*r)[0] : 1 12(*r)[1] : 2 13(*r)[2] : 3
投稿2019/09/12 12:47
編集2019/09/13 10:26総合スコア1627
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/13 01:45
2019/09/14 13:53
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。