【C言語入門】union(共用体)の使い方

共用体って使ってますか?共用体は構造体と同じように型の違うメンバを持つことができます。

ただし構造体は複数のメンバを一度に使えますが、共用体は一度に使えるメンバは1つだけです。メモリの使用を制限して型の違う変数を使用したい場合に使うと便利です。この記事では、共用体について

  • 共用体とは
  • 共用体の使い方
  • ビットフィールドの使い方

など基本的な内容から、応用的な使い方の内容についても解説していきます。今回は共用体について、使い方をわかりやすく解説します!

union(共用体)とは

共用体とはデータ型の一つで、同じメモリ領域を複数のメンバが共用する構造になっています。メンバの型は違っていても構いません。共用体のサイズはもっとも大きなメンバのサイズとなります。

メンバを持つ点で構造体と似ていますが、構造体のメンバはそれぞれアドレス先が異なるのに対して、共用体のメンバは一箇所に格納されている点で異なります。それでは共用体の使い方についてみていきましょう。

共用体の使い方

共用体は型を定義し、その型を使って変数名を宣言して使用します。型は以下のように定義します。

共用体の型の定義:

この型を使って共用体の型の変数を宣言します。

共用体の変数名の宣言:

変数を宣言する際に初期化をすることもできます。

共用体の変数名の宣言:

最初のメンバのみ初期化できます。また、共用体の型の定義と変数名の宣言を一緒に行うこともできます。

共用体の型の定義:

この場合、共用体名を省略することもできます。共用体のメンバは共用体の変数名から「.」(ドット演算子)を使用して呼び出します。

変数のメンバの呼び出し:

基本的な使い方

それでは実際の使い方をサンプルコードで確認していきましょう。

実行結果:

このサンプルコードでは、共用体「book」を定義しています。共用体「book」の変数「bk」を宣言し、文字列「桃太郎」で初期化しています。変数「bk」のサイズはメンバ内で最もサイズが大きい文字列「name」の16バイトであることがわかります。

その後、変数「bk」からドット演算子を使ってint型のメンバ「price」を呼び出し値を代入しています。メンバ「name」と「price」を出力表示していますが、メンバ「name」は表示されていません。

メンバ「price」に値を代入したことで、メンバが初期化時の「name」から「price」に変わっています。

ポインタを使った扱い方

共用体は構造体と同じようにポインタを使ってアドレスにアクセスすることができます。共用体のメンバのアドレスにアクセスする場合は「->」(アロー演算子)を使用します。

ポインタを使った変数のメンバの呼び出し:

それではサンプルコードで確認していきましょう。

実行結果:

このサンプルでは共用体のポインタ「p」を宣言しています。共用体の変数「bk」のアドレスをポインタ「p」に代入し、アロー演算子を使ってメンバ「price」にアクセスしています。

ビットフィールドの使い方

ビットフィールドは、1バイトつまり8ビット以下の変数を定義するときに使用します。変数は通常1バイト以上消費します。ビットフィールドを使うことで、サイズが8ビット未満の変数を定義することができて、バイト数の消費のムダを排除することができます。

ビットフィールドは確保するビット数に応じて扱える値の範囲が変わります。確保するビット数が

  • 1ビットの場合 0~1
  • 2ビットの場合 0~3
  • 3ビットの場合 0~7

ビットフィールドは構造体を使って宣言します。ビットフィールドのメンバの型には「unsined char」もしくは「unsined int」が使われます。ビットフィールドの宣言方法は構造体の通常の宣言方法と変わりません。

それではサンプルコードで確認していきましょう。

実行結果:

このサンプルコードでは構造体「bits」でビットフィールドの宣言とメンバの初期化を行っています。また、このビットフィールドをメンバに持つ共用体「u」を宣言しています。

共用体「u」は「unsined char」型のメンバを8個もつ構造体「b」をメンバに持っていますが、サイズは1バイトです。「b」の「unsined char」型のメンバのサイズは1ビットであることがわかります。

まとめ

ここでは、共用体について説明しました。共用体は複数の型をメンバに持つことができて、あとで型とメンバの値を変更したいときに使うと便利です。使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説