共用体
共用体:インデックス への移動
共用体は,構造体から派生した型で,構文や機能の多くの部分は構造体と同じです。決定的な相違点は,共用体は,どの時点においてもメンバーの 1 つだけが「アクティブ」であるという点です。共用体のサイズは,その共用体の最大メンバーのサイズになります。どんな場合でも,その共用体のメンバーのただ 1 つの値だけが記憶されます。次のような単純な共用体の場合,
union myunion { /* 共用体タグ = myunion */
int i;
double d;
char ch;
} mu, *muptr=μ
union myunion 型の識別子 mu は,int,8 バイトの double,または 1 バイトの char を保持するために使用することができますが,ある時点で使えるのはどれか 1 つだけです。
メモ: 共用体は Delphi の可変レコード型に対応します。
sizeof(union myunion) と sizeof(mu) は,ともに 8 を返します。しかし,mu が int オブジェクトを保持するときは 4 バイトが,また mu が char を保持するときは7バイトが未使用となります。構造体メンバー選択子(. と ->)を用いて共用体メンバーにアクセスすることができますが,その際には注意が必要です。
mu.d = 4.016;
printf("mu.d = %f\n",mu.d); //OK: mu.d = 4.016 を表示
printf("mu.i = %d\n",mu.i); //特定の結果
mu.ch = 'A';
printf("mu.ch = %c\n",mu.ch); //OK: mu.ch = A を表示
printf("mu.d = %f\n",mu.d); //特定の結果
muptr->i = 3;
printf("mu.i = %d\n",mu.i); // OK: mu.i = 3 を表示
2 番目の printf は,mu.i が整数型なので正当です。しかし,mu.i 中のビットパターンは,その前に代入された double の一部に対応し,たいていは整数として解釈しても意味はありません。
適切に変換されれば,共用体を指すポインタはその各メンバーを指し,その逆についても同じことが言えます。