C言語

【C言語】構造体の中に構造体があるときの使い方や注意点を解説

構造体の中に構造体が入っているソースコードは、現場でもよく見かけます。

なので、構造体の構造体があるソースコードについて、今回は説明していきます!

構造体の中に構造体を入れるコード

とりあえずサンプルコードを見ていただきましょう。

 

図を書くと、以下のような状態ですね。

それでは具体的に、構造体の構造体があるときの使い方を見ていきましょう!

構造体の構造体のメンバ変数の参照方法

構造体のメンバ変数を参照するには、構造体の定義名に”.”(ドット)を付けることで参照できました。

構造体の中の構造体になっても同様で、“.”(ドット)を付ければ参照することが出来ます。

構造体がポインタの場合のメンバ変数の参照方法

構造体がポインタの場合は、”->”(アロー演算子)でメンバ変数を参照することができましたね。

ただし、構造体の構造体はアドレス(ポインタ)でない場合は、”.”(ドット)を付けることでメンバ変数を参照することが出来ます。

ここが混同するのでややこしいかもしれません。

 

もう一度サンプルコードを見てみましょう。

サンプルコードの35行目で、OneOfThreeの構造体はポインタでfunc関数に渡しました。(関数先では、*ptr_classInfoというポインタの構造体名)

サンプルコード43行目のfunc関数の引数を見ての通り、構造体は*ptr_classInfoというポインタになっているため、構造体OneOfThreeのメンバ変数(classNameとstudentList[])は、”->”(アロー演算子)で参照します。

しかしstudentList[]はポインタではないため、構造体配列studentList[]のメンバ変数(name,studentNum,address)に関しては、”.”(ドット)で参照する必要があります。

構造体の構造体をポインタで渡す場合は?

あまりないと思いますが、構造体の構造体をポインタで関数に渡す場合は、どんな方法で渡すのでしょうか?

以下がサンプルコードになります。

サンプルコードの36行目で、構造体の構造体(studentList[])は、今回はポインタ(アドレス)でfunc関数に渡されています。

構造体の構造体は、*ptr_studentInfoというポインタになっているため、構造体studentList[]のメンバ変数(name,studentNum,address)は、”->”(アロー演算子)で参照します。

 

このように、「何がポインタになっているか?」が分かっていれば、”->”(アロー演算子)を使うのか”.”(ドット)を使うのかが判別できるようになります!

最後に

構造体の中に構造体があるパターンは、結構これからも見ると思いますので、理解を深めておいてください!