共用体

提供: RAD Studio
移動先: 案内検索

共用体:インデックス への移動

共用体は,構造体から派生した型で,構文や機能の多くの部分は構造体と同じです。決定的な相違点は,共用体は,どの時点においてもメンバーの 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 の一部に対応し,たいていは整数として解釈しても意味はありません。

適切に変換されれば,共用体を指すポインタはその各メンバーを指し,その逆についても同じことが言えます。