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