回答編集履歴

3

回答内容改定

2019/09/13 10:26

投稿

nomuken
nomuken

スコア1627

test CHANGED
@@ -2,4 +2,114 @@
2
2
 
3
3
 
4
4
 
5
- 引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では「配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。
5
+ ~~引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では「配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。~~
6
+
7
+
8
+
9
+ コメントをくださった方ありがとうございました。今更ですが正しく理解できました。いろいろ試したつもりでしたが当初は`int (*f(double x))[3]`の書式にたどり着けませんでした。
10
+
11
+ ```
12
+
13
+ #include <stdio.h>
14
+
15
+
16
+
17
+ int array[3] = { 1, 2, 3 };
18
+
19
+
20
+
21
+ int (*f(double x))[3]
22
+
23
+ {
24
+
25
+ return &array;
26
+
27
+ }
28
+
29
+
30
+
31
+ int main(void)
32
+
33
+ {
34
+
35
+ int (*(*x)(double))[3] = 0;
36
+
37
+
38
+
39
+ int (*r)[3] = 0;
40
+
41
+
42
+
43
+ printf("array : %p\n", array);
44
+
45
+ printf("&array : %p\n", &array);
46
+
47
+ printf("&array[0] : %p\n", &array[0]);
48
+
49
+
50
+
51
+ printf("f() : %p\n", f(1.0));
52
+
53
+
54
+
55
+ printf("f : %p\n", f);
56
+
57
+
58
+
59
+ printf("sizeof(x) : %zu\n", sizeof(x));
60
+
61
+
62
+
63
+ x = f;
64
+
65
+ r = x(1.0);
66
+
67
+ printf("x : %p\n", x);
68
+
69
+ printf("x() : %p\n", r);
70
+
71
+
72
+
73
+ printf("*r : %p\n", *r);
74
+
75
+ printf("r[0] : %p\n", r[0]);
76
+
77
+ printf("(*r)[0] : %d\n", (*r)[0]);
78
+
79
+ printf("(*r)[1] : %d\n", (*r)[1]);
80
+
81
+ printf("(*r)[2] : %d\n", (*r)[2]);
82
+
83
+ }
84
+
85
+ ```
86
+
87
+ ```result
88
+
89
+ array : 00404004
90
+
91
+ &array : 00404004
92
+
93
+ &array[0] : 00404004
94
+
95
+ f() : 00404004
96
+
97
+ f : 00401410
98
+
99
+ sizeof(x) : 4
100
+
101
+ x : 00401410
102
+
103
+ x() : 00404004
104
+
105
+ *r : 00404004
106
+
107
+ r[0] : 00404004
108
+
109
+ (*r)[0] : 1
110
+
111
+ (*r)[1] : 2
112
+
113
+ (*r)[2] : 3
114
+
115
+ ```

2

誤記修正

2019/09/13 10:26

投稿

nomuken
nomuken

スコア1627

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- 引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では配列は返せないがtypedefで型を定義することで解決できるみたいです。
5
+ 引数は「double」、戻り値は「int[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では配列へのポインタ」は返せない(ただのポインタなら返せる)がtypedefで型を定義することで解決できるみたいです。

1

誤り修正

2019/09/12 23:10

投稿

nomuken
nomuken

スコア1627

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- 引数はdouble、戻り値はint[3]である関数の関数ポインタですね。普通に実装すると戻り値では配列は返せないがtypedefで型を定義することで解決できるみたいです。
5
+ 引数はdouble、戻り値はint[3]へのポインタ」である関数の関数ポインタですね。普通に実装すると戻り値では配列は返せないがtypedefで型を定義することで解決できるみたいです。