teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

回答内容改定

2019/09/13 10:26

投稿

nomuken
nomuken

スコア1627

answer CHANGED
@@ -1,3 +1,58 @@
1
1
  [関数のパラメータ宣言の意味は? - stackoverrun.com](https://stackoverrun.com/ja/q/11242156)と同じ問題ですかね。
2
2
 
3
- 引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では「配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。
3
+ ~~引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では「配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。~~
4
+
5
+ コメントをくださった方ありがとうございました。今更ですが正しく理解できました。いろいろ試したつもりでしたが当初は`int (*f(double x))[3]`の書式にたどり着けませんでした。
6
+ ```
7
+ #include <stdio.h>
8
+
9
+ int array[3] = { 1, 2, 3 };
10
+
11
+ int (*f(double x))[3]
12
+ {
13
+ return &array;
14
+ }
15
+
16
+ int main(void)
17
+ {
18
+ int (*(*x)(double))[3] = 0;
19
+
20
+ int (*r)[3] = 0;
21
+
22
+ printf("array : %p\n", array);
23
+ printf("&array : %p\n", &array);
24
+ printf("&array[0] : %p\n", &array[0]);
25
+
26
+ printf("f() : %p\n", f(1.0));
27
+
28
+ printf("f : %p\n", f);
29
+
30
+ printf("sizeof(x) : %zu\n", sizeof(x));
31
+
32
+ x = f;
33
+ r = x(1.0);
34
+ printf("x : %p\n", x);
35
+ printf("x() : %p\n", r);
36
+
37
+ printf("*r : %p\n", *r);
38
+ printf("r[0] : %p\n", r[0]);
39
+ printf("(*r)[0] : %d\n", (*r)[0]);
40
+ printf("(*r)[1] : %d\n", (*r)[1]);
41
+ printf("(*r)[2] : %d\n", (*r)[2]);
42
+ }
43
+ ```
44
+ ```result
45
+ array : 00404004
46
+ &array : 00404004
47
+ &array[0] : 00404004
48
+ f() : 00404004
49
+ f : 00401410
50
+ sizeof(x) : 4
51
+ x : 00401410
52
+ x() : 00404004
53
+ *r : 00404004
54
+ r[0] : 00404004
55
+ (*r)[0] : 1
56
+ (*r)[1] : 2
57
+ (*r)[2] : 3
58
+ ```

2

誤記修正

2019/09/13 10:26

投稿

nomuken
nomuken

スコア1627

answer CHANGED
@@ -1,3 +1,3 @@
1
1
  [関数のパラメータ宣言の意味は? - stackoverrun.com](https://stackoverrun.com/ja/q/11242156)と同じ問題ですかね。
2
2
 
3
- 引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では配列は返せないがtypedefで型を定義することで解決できるみたいです。
3
+ 引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。

1

誤り修正

2019/09/12 23:10

投稿

nomuken
nomuken

スコア1627

answer CHANGED
@@ -1,3 +1,3 @@
1
1
  [関数のパラメータ宣言の意味は? - stackoverrun.com](https://stackoverrun.com/ja/q/11242156)と同じ問題ですかね。
2
2
 
3
- 引数はdouble、戻り値はint[3]である関数の関数ポインタですね。普通に実装すると戻り値では配列は返せないがtypedefで型を定義することで解決できるみたいです。
3
+ 引数はdouble、戻り値はint[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では配列は返せないがtypedefで型を定義することで解決できるみたいです。