共用体に関する記事です。
ポインタを使った参照方法などについても解説しています。
共用体とは?
共用体とは、同じメモリ領域を異なるデータ型で共有するためのものです。
共用体は異なるデータ型のメンバ変数を含むことが出来ますが、同時に複数のメンバを利用することは出来ません。
また、共用体のメモリ領域は、最も大きなメンバ変数と同様の大きさとなります。
例えば以下のようなメンバ変数を持つ共用体の場合は、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