共用体・union/構造体との違い

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

構造体は、複数の異なるデータ型のメンバから構成された、新しいデータ型を定義するために使用します。
構造体のメンバは、それぞれが独自に記憶領域を確保します。

スポンサーリンク

構造体

struct structure {
    int     width;
    float   height;
};

————-
|   width   |
————-
|   height   |
————-

構造体は、メンバがそれぞれの記憶域を確保する。

共用体

共用体は、構造体に似てはいますが、複数のメンバが一つの記憶域を確保します。
共用体の定義には、unionを用います。

union common {
    int     width;
    float   height;
};

——————-
|   width/height   |
——————-

共用体は、複数のメンバが同じ領域を共有する。

構造体と共用体の違い

構造体の場合、メンバはそれぞれの記憶領域に割り当てられるため、メンバ同士はまったく無関係となります。
1つのメンバの値を変更しても、他のメンバへの影響はなく変化しません。

一方、共用体は、すべてのメンバが同じ領域に割り当てられているため、一度に1つのみのメンバが有効となります。
つまり、widthになにか値が代入してあった場合、新しくheightに値を代入すると、widthの値は消されてしまいます。

共用体の動作確認

#include <iostream>
 
union common {
    int     width;
    float   height;
} data;
 
int w;
float h;
 
int main() {
    data.height = 10.0;    // 次行のdata.width = 5により消される
    data.width = 5;        // 有効な代入となる
 
    w = data.width;        // 有効
    h = data.height;    // 無効
 
    std::cout << w << "\n";        // 有効。ちゃんと出力される
    std::cout << h << "\n";        // 無効。変な出力になる
 
    return 0;
}

実行結果。

5
7.00649e-045
スポンサーリンク
 
スポンサーリンク