構造体/共用体
構造体は異なる型の変数を組み合わせ、新しいデータ型として扱うものです。これにより大きなプログラムの中ではデータの管理がスッキリして操作しやすくなります。
一般形:
struct 構造体タグ{
型 メンバ名;
:
:
}
struct 構造体タグ 識別子;
例)成績のデータ
struct seiseki{
long gakuseki; /* 学籍番号
*/
int sugaku; /* 数学 */
int eigo; /* 英語 */
char hyouka; /* 評価 */
}
struct seiseki p1,p2,p3; /* 識別子:p1,p2,p3 */
上記の例では、学籍番号gakuseki, 数学sugaku,
英語eigo, 評価hyoukaのデータを学生ごとに識別子(変数)を割り当てて扱っている。個人の数学や英語の得点を表すには、識別子(.)にメンバ名sugaku,eigoを伴って記述することになる。
識別子p1(p1の学生)に対して
学籍番号: p1.gakuseki
数 学 : p1.sugaku
英 語 : p1.eigo
評 価 : p1.hyuuka
つまり、p1さんとp2さんの英語の得点を比較する場合、次のように用いることができる。
if (p1.eigo>p2.eigo)
printf("p1さんの方が英語の得点が高い\n");
ポインタを介した構造体の指定
ポインタの指す先のオブジェクトが構造体であるとき、そのメンバを指定するには、演算子(->)を用います。
一般形:
(構造体を指すポインタ) -> (構造体に含まれるメンバ名)
例)
typedef struct { /* 構造体タグACLOCKを定義 */
int ready;
int hour, minute, second;
int cx, cy;
} ACLOCK;
void DISPLAY(ACLOCK *pt) /* 関数DISPLAYを定義、構造体ポインタ変数名ptを宣言 */
{
if (pt->ready == 0){ /* ptの指す構造体のメンバ名readyが0である時、cxとcyを0にする */
pt->cx=0:
pt->cy=0;
pt->ready=1;
}
:
}
共用体は、同一のメモリ領域をそれぞれ異なる型の別の名で操作できるようにするものです。
一般形:
union 共用体タグ{
型 メンバ名;
:
};
例) union kyoyo{
char xn;
int xd;
};
xnはchar型で8ビットであるのに対してxdはint型で32ビットのデータである。つまり、kyoyoでは8ビット分のメモリが両データにおいて共用されていることになる。以下の例では、k.cに対して'1'が代入され文字コードが記憶されるが、実際に画面に表示しているのは、int型で定義されているk.aの値である。
union kyoyo{ /* 共用型kyoyoの定義
*/
char c;
int a;
};
union kyoyo k; /* 共用型変数kの宣言
*/
k.c='1';
printf("%x\n",k.a);