PR

【C・C++】共用体とは?【宣言・代入・参照方法】

アイキャッチ C++
この記事は約4分で読めます。

共用体に関する記事です。
ポインタを使った参照方法などについても解説しています。

のんびり丸

WEBアプリの開発等をしています。
日々の学習の備忘録として運営していこうと思います。

のんびり丸をフォローする

共用体とは?

共用体とは、同じメモリ領域を異なるデータ型で共有するためのものです。
共用体は異なるデータ型のメンバ変数を含むことが出来ますが、同時に複数のメンバを利用することは出来ません。

また、共用体のメモリ領域は、最も大きなメンバ変数と同様の大きさとなります。
例えば以下のようなメンバ変数を持つ共用体の場合は、doubleのサイズと同じになります。

  • int【4バイト】
  • double【8バイト】
  • char【1バイト】

共用体の宣言

共用体を利用する場合は、以下の二つの工程が必要です。

  • 共用体テンプレートの宣言
  • 共用体変数の宣言

共用体テンプレートの宣言

まず最初に、共用体の構成要素を決定していきます。
これを共用体テンプレートの宣言と言います。

自分で新しいデータ型を作成するイメージです。
実際に共用体を作ってみます。

union 共用体テンプレート {
メンバ変数①;
メンバ変数②;
・・・
};

// 共用体の宣言
union TEST {
	char A;
	int price;
	double num;
};

共用体変数の宣言

共用体テンプレートの宣言後、実際に共用体を使う場合は、共用体変数の宣言をします。
設計図から実物を作成するイメージです。

union 共用体テンプレート 共用体変数;
共用体テンプレート 共用体変数;

// 共用体変数の宣言
union TEST TEST1;
TEST TEST2; // unionの省略

【union】は、省略して記述することも可能です。

テンプレートと変数の同時宣言

共用体テンプレートの宣言と、共用体変数の宣言は同時に行うことが出来ます。

union 共用体テンプレート {
メンバ変数①;
メンバ変数②;
・・・
} 共用体変数;

// 共用体の宣言
union TEST {
	char A;
	int price;
	double num;
} TEST1; // 変数の宣言

共用体の利用

共用体のメンバ変数にアクセスする場合は、【共用体変数名.メンバ名】と入力します。
変数に値を代入してみて、どのように機能するのか確認してみましょう。

コーディング例①

#include <stdio.h> // printf()を使用するために必要

// 共用体テンプレートの宣言
union TEST {
	char A;
	int price;
	double num;
};

// 共用体変数の宣言
TEST TEST1;

int main()
{
	TEST1.A = 5;
	printf("%d\n", TEST1.A);

	return 0;
}
出力
5

コーディング例②

同じメモリ領域を共有しているので、意図しない値が出力されます。

#include <stdio.h> // printf()を使用するために必要

// 共用体テンプレートの宣言
union TEST {
	char A;
	int price;
	double num;
};

// 共用体変数の宣言
TEST TEST1; 

int main()
{
	TEST1.A = 5;
	TEST1.price = 100;
	printf("%d\n", TEST1.A);

	return 0;
}
出力
100

ポインタの利用

共用体変数も、通常の変数と同様にポインタで指し示すことが出来ます。
共用体テンプレートをデータ型のようにイメージすると分かりやすいかと思います。

ポインタを使って共用体のメンバ変数を参照する場合は、【ポインタ名->メンバ名】と入力します。

ちなみに、【->】はアロー演算子と言います。
矢のような形をしているので、アローです。

コーディング例①

#include <stdio.h> // printf()を使用するために必要

// 共用体テンプレートの宣言
union TEST {
	char A;
	int price;
	double num;
};

// 共用体変数の宣言
TEST TEST1;
TEST *pTEST1 = &TEST1;

int main()
{
	pTEST1->A = 5;
	printf("%d\n", pTEST1->A);

	return 0;
}
出力
5

似ている機能

構造体

クラス

タイトルとURLをコピーしました