C++で質問です。
すいません、初心者でして誰も聞けるような人がおらず助けてください・・・。
まずソースを書きます。
******************************************************************
1 #include < iostream >
2 using namespace std;
3
4 struct Person{
5 double height;
6 double weight;
7 };
8
9 void showhuman ( Person* h );
10 int main ( ) {
11 Person info[ 2 ];
12
13 for ( int i = 0; i < 2; i++ ) {
14 cout << 身長を入力してください。\n;
15 cin >> info[ i ].height;
16 cout << 体重を入力してください\n;
17 cin >> info[ i ].weight;
18 }
19
20 showhuman( info );
21
22 return 0;
23 }
30
31 void showhuman( Person* h ) {
32 for ( int j = 0; j < 2; j++ ) {
33 cout << 身長 << h[ j ].height << 体重
34 << h[ j ].weight << '\n';
35 }
36 }
******************************************************************
このソース中の20行目で引数をshowhuman関数へ渡しています。showhuman関数はポインタで
配列の先頭のアドレスを受け取っていると思うのですが、アロー演算子ではなくドット演算子で
ビルドが通ります。私の知識ではshowhuman関数が引数をポインタで受けたときはアロー演算子
でなくちゃいけない、且つ20行目はshowhuman( &info )と思っていたのですが、これではエ
ラーがでてしまいます。
基本的に配列を含んだ引数を関数に渡した時は、関数内ではドット演算子を使用すると認識して
よろしいのでしょうか?
宜しくお願い致します。
Person* h;
のとき、
(h[0])
の型は、Person、である事はわかります?
ドットとアローですけど、関数内では、とか、引数として、とかじゃなく、
(値の)構造体、オブジェクトには ドット、
構造体、オブジェクトへのポインタには アロー、
を使用します。
この場合、[] によってポインタ剥がしが行われるために、
値を示すことになろので、ドットを使うわけです。
仮に [] を使わないとしたら
( h + j )->weight;
という表記になります。
一応こちらも確認。
Person info[ 2 ];
のときに、
info;
が、配列の先頭アドレスを示す、ということは理解されてます?
なるほどです!
構造体、オブジェクトにはドット、
構造体、オブジェクトへのポインタにはアロー
理解できました。
本当にありがとうございます。一人じゃ理解できませんでした・・・(^^;)