回答編集履歴

1

質問の追記に応じて回答の追記

2019/07/28 05:01

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -35,3 +35,49 @@
35
35
 
36
36
 
37
37
  表示のループ内の処理にindexが含まれていないのですから、ループの意味がないんじゃないか、ぐらいは気がついて欲しいと思います。
38
+
39
+
40
+
41
+ ---
42
+
43
+ 以下質問追記分について
44
+
45
+ ```C+
46
+
47
+ lengthOfName(pPerson)
48
+
49
+ ```
50
+
51
+ > おそらくこの部分がうまく参照できず、一番最初の名前を引っ張ってきているみたいです。
52
+
53
+
54
+
55
+ ズバリその通り。名前の表示の方も根っこは同じ話なんですけど、なんでそっちは出来てこっちは出来なかったのかしら。
56
+
57
+
58
+
59
+ C/C++では、配列はその先頭要素へのポインタで代表されます。配列が単独で記述されれば先頭要素へのポインタと解釈されますし、pがポインタ、iが整数としたとき `*(p+i)`と`p[i]`は等価、同じ意味を持つという決まりになっています。
60
+
61
+ この決まりに沿って読み解けば、lengthOfName()関数に与えられたpPersonは、配列としては最初の要素(つまり一人目)へのポインタです。毎回一人目のデータへのポインタを与えているのですから、lengthOfName()関数は毎回一人目の名前の文字数を返してきます。
62
+
63
+
64
+
65
+ やりたい仕事から言えば、lengthOfName()関数には配列の欲しいインデックスの要素へのポインタを与えなければいけません。なので、そのようにするなら
66
+
67
+ ```
68
+
69
+ lengthOfName( &pPerson[index] )
70
+
71
+ ```
72
+
73
+ または
74
+
75
+ ```
76
+
77
+ lengthOfName( pPerson+index )
78
+
79
+ ```
80
+
81
+ でしょう。
82
+
83
+ (直したら動いた、だけじゃなくて意味をよく噛み締めてくださいね。この辺、よくわからないまま*を付けたり&を付けたりして動いたらヨシとする、という初心者をよく見かけます。)