12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C言語 構造体と共用体の違い

Last updated at Posted at 2021-12-23

始めに

この記事はC言語を始めて1年弱の初心者が気になったことをまとめて書いたものです。あまり参考にならないと思いますがご了承ください。誤字・脱字、内容の間違いなどがあればご指摘ください。

初投稿なので拙い文章ではありますがよろしくお願いします。

構造体・共用体について

そもそも構造体・共用体とは何か、自分なりにまとめてみました。

1.構造体

構造体とは、簡単に言えば**「データ型が異なる複数のデータをまとめて格納できるデータ型」というものです。
複数のデータをまとめるという点は配列と同じですが、
「中に格納するデータのデータ型が違っても格納できる」**という特徴があります。

構造体の定義・変数宣言
struct 構造体名             例)struct DATE_DATA
{                 {
    メンバ宣言1;                   int year;   
    メンバ宣言2;                   int month;
    メンバ宣言3;                   int day;
        ︙             };
};

struct 構造体名 構造体変数名;    struct DATE_DATA x;

構造体の定義・変数宣言は上記の通りです。typedefを使って定義することもできますが、今回は割愛させていただきます。

構造体を定義すると、メンバの数とデータ型のサイズに応じてメモリ内に連続して記憶領域が確保されます。なので構造体のメンバが増えれば増えるほど構造体は大きくなります。

2.共用体

次に共用体ですが、データ型が異なる複数のデータを扱うという点では構造体と同様です。
違う点として、**「複数のデータ型を同じ記憶領域で使い分ける」**という点が挙げられます。

共用体の定義・変数宣言
union 共用体名              例) union DATE_DATA
{                   {
    メンバ宣言1;                    int year;   
    メンバ宣言2;                    int month;
    メンバ宣言3;                    int day;
        ︙              };
};

union 共用体名 共用体変数名;     union DATE_DATA x;

共用体の定義・変数宣言は上記の通りです。構造体と同様にtypedefを使って定義することもできますが、これも割愛させていただきます。

共用体を定義すると、その共用体のメンバの中で最も大きいデータ型の大きさの記憶領域が割り当てられます。

構造体と共用体の違い

大きな違いとして、**「使用した時の動作の違い」が挙げられます。
構造体ではデータ型の異なる複数のデータを同時に代入することができますが、共用体ではそれぞれのメンバが同じ記憶領域を使用するので2つ目のデータが代入された時点で1つ目に代入されたデータが上書きされます。そのため構造体のように同時に複数のデータを代入することができません。
もう一つの違いとして、
「定義した時に割り当てられる記憶領域の大きさ」**が挙げられます。
例えばメンバ内でchar x; short y; int z;の3つを宣言したとすると、構造体に割り当てられる記憶領域の大きさはchar型の1バイトshort型の2バイトint型の4バイトの合計7バイトの記憶領域が割り当てられます。
対して共用体では、メンバ内で宣言されたものの中で一番大きいデータ型の大きさの記憶領域を割り当てるので、割り当てられる記憶領域は4バイトとなります。

それぞれのメリット・デメリット

違いを踏まえたうえでそれぞれのメリットとデメリットをまとめてみました。

メリット デメリット


それぞれデータ型の異なるメンバに複数のデータを同時に代入することができる メンバの数が増えると増えた分多くのメモリを消費してしまう


メンバの数を増やしても割り当てられる領域は一番大きいデータ型のものだけなのでメモリの消費を抑えることができる 対応したメンバは存在するがそれぞれデータ型の違う値を複数同時に代入することができない

まとめ

違いを簡潔にまとめると、

構造体
  • いろんなデータ型の値を複数同時に扱うことができる
  • メンバが増えるとそれに伴ってメモリの消費も増える
共用体
  • いろんなデータ型の値を複数扱うことはできるが同時に扱うことはできない
  • メンバが増えても一番大きいデータ型の大きさのメモリの消費だけで済む

その時の状況に応じて使い分けるのが一番ですが、慣れないうちは構造体で事足りると思います。

終わりに

今回、C言語を一通り学習したうえで気になったことを簡単にまとめてみました。
まだまだ分からないことも多く手探り状態ですが、もっといろんなコードを書いて慣れていこうと思います。

最後まで読んでいただき、ありがとうございました。

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?