共用体

構造体は様々な型のデータをひとまとめにして管理する変数ですが、共用体は様々な型のデータを共通のメモリー領域で管理します。


共用体でのデータ管理イメージは次のようになります。

共用体メージ

上図のように共用体を宣言したときは、その内部変数が同じアドレスから領域を確保していきます。これによりメモリーの節約ができます。


共用体の構文

共用体を使用するには、構造体と同様、まずその定義を行い、それを一つの型として宣言します。


共用体の定義

共用体の定義は構造体とほとんど同じで、「struct」を「union」に変更するだけです。

union 共用体名 {
  データ型 メンバー名;
          ・
          ・
          ・
} 変数名;

※共用体名と変数名はどちらか一方のみ省略可能です。


共用体の宣言

union 共用体名 変数名;

宣言と同時に値を代入(初期化)するときは、構造体とは異なり最初の内部変数にのみ可能です。

union 共用体名 変数名 = {データ1};

▲PageTop

共用体へのアクセス

共用体のメンバーにアクセスする方法は構造体のときと同じです。


共用体変数のメンバーへのアクセス

”.”(ドット演算子)を使用します。

共用体変数名.メンバー変数名;

配列のときはこのようになります。

共用体変数名[添え字].メンバー変数名;

共用体のポインタからメンバーへのアクセス

”->”(アロー演算子)を使用します。

共用体へのポインタ名 -> メンバー変数名;

▲PageTop

共用体の使用

サンプルを使って実際に使用方法を確認します。


・サンプルソース(sample0901.c)

#include <stdio.h>

union Book {
    char name[30];  /* 名前 */
    int  price;  /* 価格 */
};

int main() {
    /* 共用体Book型変数の宣言 */
    union Book book = {"プログラミング言語C"};
    /* 共用体Book型配列の宣言 */
    union Book ary_book[2] = {{"プログラミング言語C"}, {"C言語入門"}};
    /* 共用体Book型ポインタの宣言 */
    union Book *ptr_book;
    printf("--- 1. 共用体Book型変数の使用 ------------------------------\n");
    printf("■名前を使用\n");
    printf("名前:%s\n", book.name);
    printf("■価格に変更\n");
    book.price = 2800;
    printf("価格:%d円\n", book.price);
    printf("------------------------------------------------------------\n");
    printf("--- 2. 共用体Book型配列の使用 ------------------------------\n");
    printf("■表示\n");
    printf("配列[0].名前:%s\n", ary_book[0].name);
    printf("配列[1].名前:%s\n", ary_book[1].name);
    printf("■変更\n");
    ary_book[0].price = 2940;
    ary_book[1].price = 2100;
    printf("配列[0].価格:%d円\n", ary_book[0].price);
    printf("配列[1].価格:%d円\n", ary_book[1].price);
    printf("------------------------------------------------------------\n");
    printf("--- 3. 共用体Book型ポインタの使用 --------------------------\n");
    ptr_book = &book;
    printf("■表示\n");
    printf("価格:%d円\n", ptr_book->price);
    printf("■変更\n");
    ptr_book->price = 3000;
    printf("価格:%d円\n", ptr_book->price);
    printf("------------------------------------------------------------\n");

    return 0;
}

・実行結果

C:\dev\c>sample0901 [Enter]
--- 1. 共用体Book型変数の使用 ------------------------------
■名前を使用
名前:プログラミング言語C
■価格に変更
価格:2800円
------------------------------------------------------------
--- 2. 共用体Book型配列の使用 ------------------------------
■表示
配列[0].名前:プログラミング言語C
配列[1].名前:C言語入門
■変更
配列[0].価格:2940円
配列[1].価格:2100円
------------------------------------------------------------
--- 3. 共用体Book型ポインタの使用 --------------------------
■表示
価格:2800円
■変更
価格:3000円
------------------------------------------------------------
        

▲PageTop