【第13回】


『内容』

<構造体とポインタ>

 ポインタは変数を指すものなので,構造体変数を指し示すこともできる.


<共用体>

 構造体と記述方法はほぼ同じであるが,根本的に異なる点がメモリ領域の使い方である.構造体では各メンバにメモリ領域を与えていたが,共用体では各メンバを共通のメモリ領域に割り当てる(教科書p.81参照).つまり,メンバ中で最も大きいメモリ容量分しかメモリが割り当てられない(メモリの有効利用ができる).すなわち,共用体で扱うことのできるメンバは1度に1つだけである.


『演習』

8.構造体と共用体
8.1.6 構造体のtypedef

 新しく名前を付けるtypedef文(教科書p.11の2.1.4にて前述されている)を用いると,構造体変数の宣言が簡略化できる(教科書p.78の「文法8-10」,およびその下を参照).


8.1.7 構造体とポインタ

 構造体変数を指し示すポインタも存在する.一般の変数と構造体変数のポインタの宣言方法は,
 【int型変数ポインタ】


  int *ptr;
  ptr = &data;
 【構造体変数ポインタ】

  struct STUDENT *stptr;
  stptr = &stdata;
となる.構造体タグ名を指定して構造体ポインタが宣言される点に注意せよ(教科書p.78の「文法8-11」,ならびにその上を参照).
 構造体ポインタを用いて各メンバにアクセスする場合,ピリオド「.」ではなく,矢印「->」を用い,「構造体ポインタ名->メンバ名」として指定する(教科書p.79の上部参照).

 教科書p.79の「プログラム8-4」を実行し,その動作を確認せよ.

 「プログラム8-4」は,関数の引数として,構造体そのものと構造体ポインタを使った違いを分かり易くするために,両方の方法を示している.しかし,構造体そのものを引数とする方法は,プログラムの処理速度の面で劣るので,構造体ポインタを引数に使う方が一般的である.

 「プログラム8-4」を修正し,関数print_data()の引数として,構造体ポインタを使用するものにせよ.

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)

 上記のプログラムをさらに修正し,構造体のメンバに年齢(int age;)を追加せよ.関数print_data()では,年齢も含めた全てのメンバの値を表示し,関数up_data()では,年齢も変更できるようにせよ.

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)



8.2 共用体

 共用体は構造体によく似ており,違いは,メモリ領域の使用方法である.各メンバのメモリ領域を共通で使用するためにメモリ領域を有効に使用することができる.

8.2.1 共用体の定義

 構造体の型定義ならびに変数宣言と同様であり,違いは「struct」が「union」になるだけである(教科書p.80の「文法8-12」,「文法8-13」,「文法8-14」を参照).


8.2.2 メモリ配置と初期化

 構造体では全メンバのデータを同時に記録できるようにメモリ領域が確保されたのに対し(教科書p.73の図を参照),共用体ではメンバ中で必要とされる最も大きいデータ領域分しかメモリ領域を確保しない(教科書p.81の図を参照).
 したがって,共用体では同時に扱えるメンバは1つのみであり,各メンバのメモリ領域を共通して使用することから共用体と呼ばれる.
 扱えるメンバが1つであるために,初期化の方法は構造体と異なり,1番目のメンバの値しか与えることができない(教科書p.81の「文法8-15」を参照).


8.2.3 各メンバへのアクセス

 共用体の各メンバへのアクセス方法は,構造体と同じようにピリオド「.」を用いる.また,ポインタによる参照の場合も矢印「->」を使用する.
 入れ子構造にすることも可能であり,共用体の中の構造体,構造体の中の共用体とすることも可能である.


8.2.4 共用体のtypedef

 構造体と同様にtypedef文を使用すれば,共用体の変数宣言が簡略化される(教科書p.82の「文法8-16」を参照).

 教科書p.82の「プログラム8-5」を実行し,その動作を確認せよ.

 教科書p.83の「演習問題(7)」を行え.

 解答例 ←(まずは見ないで,自分で考えてプログラムすること)


レポート課題12(授業終了後にアップロード)

 RePORTシステム