カテゴリー
C++

構造体について知ろう

この章では構造体について説明します。
「構造体」はバラバラの異なる型のデータを持つ変数同士を1つの型として扱うことが出来ます。
それに対して配列は単一のデータ型しかまとめて扱う事はできません。
例えば、学生の成績はint型、身長はdouble型、名前はchar型で扱いたい時に様々なデータ型なので配列では扱うことが出来ません。
このような時に構造体を使います。
では例をみてみましょう。111 1構造体の宣言する時はstructを使います。
構造体型の名前は自由に付けてください。
そしてstructのブロックの中にメンバの宣言をして、終わりに「;」を付けます。
メンバとは変数の別名だと思ってください。
このメンバに後からデータを入れていきます。
この例では以下の部分が構造体の宣言です。1 構造体の宣言は関数の外で宣言するとその場所から下のプログラムのすべてで使うことが出来ますが、関数の中で宣言すると関数の中でのみ使うことが出来ます。
構造体型を宣言すると構造体型に属する変数を作ることが出来るようになります。
構造体型の変数も普通の変数と同じように宣言をしなくてはいけません。
宣言をしましたら、値を入れるのですが、通常の変数と同じで宣言と同時に初期化することが出来ます。
以下の基本構文が構造体型変数の初期化です。1 この例では以下の箇所が構造体型変数の宣言と初期化です。11 は以下の構造体のメンバに上から順に代入されます。1 構造体型の配列でもデータを入れることが出来ます。1 構造体型の配列も通常の配列と同じで宣言と同時に初期化することが出来ます。
例では以下のように書いています。1 ではこのプログラムの説明に入ります。
11ここでは構造体の型の変数を宣言と同時に初期化しています。
この時、気を付けなくてはいけないのは1の中の要素の書き順は構造体の宣言の中のメンバの順番と合わせてください。
例えば、1のような書き方はいけません。1 1のように1つ1つ初期化するのではなく、構造体型の配列で個人のデータを初期化しています。1 例えばint id;のデータを得たい時には1という形式で1と記述します。
これで1が出力されます。
構造体の配列はfor文で出力しています。1 iには0から2がループごとに代入され、以下のように出力されます。111 先ほどの例では構造体型の変数と配列の2つを使いましたが、以下のように構造体型の配列だけ使用しても結果は同じになります。1 次の例は構造体でのscanfの使い方について説明します。11 scanfの使い方が構造体では違うということではありませんが、scanfと構造体の組み合わせでも書けることを覚えておいてください。11 今までは1のように構造体の変数に値を入れていましたが、scanfなどを使ってデータを入れる場合にはこの例のように単独で構造体の宣言を行ってから、scanfでデータを入れていきます。1 結果は以下の通りです。1 次の例では構造体を関数に渡す方法について説明します。1111 11実引数が1のように構造体型変数なので、仮引数も1のように構造体変数で受け取ります。
メンバの値を出力するには1という形式で書きます。
11メンバの値を出力するには1という形式で書きます。1
次の例では構造体型のポインタを使用する方法について説明します。11111 ここでは構造体型変数のアドレスを実引数にして、hu関数を呼び出していますが、仮引数では構造体型のポインタで受けています。1 ここに見慣れない「->」という記号がありますが、これはアロー演算子と呼ばれています。アロー演算子は構造体型のポインタから構造体のメンバにアクセスするために使います。1 ここでは構造体型の配列のアドレスを引数にして、yo関数を呼び出しています。1 実引数であるseito2配列をyo関数の中の構造体型のポインタで受けています。
この構造体型の配列の要素にアクセスするには1 のようにポインタを進めながら書きます。
つまり、iの値がループするごとに進むので、ポインタが示す位置も変わります。
次の例では構造体の配列について説明します。111 この例ではscanfを使って、入力した値を構造体の配列に入れています。
初めに構造体の配列名と要素数を決めましたら、以下のようにブロックの末尾に配列名と要素数を配置します。1 そして、以下のscanfで入力した値をメンバに代入します。
scanfの引数にあるメンバはカンマで区切れば複数書く事が出来ます。
変換指定子もメンバの数だけ書いてください。1 111そして、入力した値をprintfで出力します。1 結果は以下の通りです。1