C/C++ · 1 min read · Oct 10, 2025
C/C++を段階的に学ぶ - ページ11
11. 段階的C/C++ — Cプログラミング - ユニオン
ユニオン
| | 1. はじめに
- ユニオンについて
- ユニオンの宣言
- ユニオン変数の定義
- 構造体とユニオンの違い
- ユニオンの操作
- ユニオンのスコープ |
1. はじめに
| | / 81_union.c /
#include
struct s_emp
{
int eno;
char name[20];
float sal;
};
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct s_emp se;
union u_emp ue;
printf(“\n従業員構造体のサイズ : %d”, sizeof(se));
printf(“\n従業員ユニオンのサイズ : %d”, sizeof(ue));
return 0;
} | | | 出力: 従業員構造体のサイズ : 26
従業員ユニオンのサイズ : 20 |
2. ユニオンについて
プログラムで使用する変数が多数要求される場合、それらは大量のメモリを占有します。ユニオンは、置換技術を使用してメモリを節約する最も簡単な方法を提供します。すべてのタイプの変数に対して同じメモリ位置を使用します。
ユニオンは、Cのデータ型であり、同じメモリ領域に複数の変数を重ねて配置することを可能にします。
ユニオンの特徴:
| | 1. ユニオンは、メモリの単一の場所に異なるタイプの値を格納します。
- ユニオンは、異なるタイプの値のいずれかを含むことができますが、一度に格納されるのは1つだけです。
- ユニオンは、1つのデータ型の値のみを保持します。新しい代入が行われると、以前の値は無効になります。
- 任意の数のユニオンメンバーが存在することができます。しかし、ユニオン型変数は、そのメンバーが占有する最大のメモリを取ります。 |
3. ユニオンの宣言
ユニオンは、異なるタイプとサイズのオブジェクトを異なる時間に格納できるデータ型です。ユニオンの定義は構造体と同じです。宣言の唯一の変更は、キーワードstructの代わりにキーワードunionを置き換えることです。
| |
|
例:
| | union ddate
{
int day;
int month;
int year;
}; | union student
{
int sno;
char name[20];
int marks;
float avg;
}; |
4. ユニオン変数の定義
ユニオン変数の定義は、構造体と同じであり、intのような組み込みデータ型を定義する場合と同じです。
| | int a; / 有効 /
union date d; / CおよびC++の両方で有効 / |
ユニオンサイズの計算
C/C++のすべてのデータ型には、指定されたサイズがあります。つまり、intは2バイトのサイズ、floatは4バイトのサイズなどです。ここにユニオン変数のサイズを見つける方法があります。
sizeof:- この関数は、指定された変数のサイズを見つけるために使用されます。
| | printf(“%d”, sizeof(int)); / 2 /
printf(“%d”, sizeof(float)); / 4 /
printf(“%d”, sizeof(union emp)); / empユニオンのサイズを表示 / |
5. 構造体とユニオンの違い
構造体とユニオンの違いは以下の通りです。
| 構造体 | ユニオン ** |
| 1. 単一の場所に異なるタイプ(変数)を保持できます。 | 1. 異なる場所に異なるタイプ(変数)を保持できます。 |
| 2. 1つ以上のタイプ(変数)を含むことができますが、一度に格納されるのは1つだけです。 | 2. 1つ以上のタイプ(変数)を含むことができますが、すべてが同時にメモリに格納されます。 |
| 3. 任意の数のユニオンメンバーが存在することができます。しかし、ユニオン型変数は、そのメンバーが占有する最大のメモリを取ります。 | 3. すべてのメンバーのサイズのメモリが必要です。 |
| 4. 処理中は、任意の時点で1つのメンバーのみがアクセスできます。 | 4. 処理中は、すべてのメンバーにいつでもアクセスできます。 |
| 5. ユニオンのスコープは関数であり、そのメンバーのスコープもユニオン自体と同じです。(プログラム内で直接アクセスできます)。 | 5. 構造体のスコープは関数のみです。構造体メンバーはプログラム内で直接アクセスできません。 |
6. ユニオンの操作
ユニオンは構造体と似ており、構造体のようにすべての操作を実行できます。ユニオンに対する操作は以下の通りです。
| | • ユニオン変数は別のユニオン変数に代入できます。
• ユニオン変数は、パラメータとして関数に渡すことができます。
• ユニオン変数のアドレスは、アドレス演算子(&)を使用して抽出できます。
• 関数はユニオンまたはユニオンへのポインタを受け入れ、返すことができます。 |
| | / 82_union.c /
#include
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf(“従業員番号を入力してください : “); scanf(“%d”, &ue.eno);
printf(“従業員名を入力してください : “); scanf(“%s”, ue.name);
printf(“従業員給与を入力してください : “); scanf(“%f”, &ue.sal);
printf(“\n\n従業員の詳細は以下の通りです… “);
printf(“%d %s %f “, ue.eno, ue.name, ue.sal);
return 0;
} |
| | 出力は何ですか?
ue.salだけが正しいです。他の変数はどうなりますか。 |
任意の瞬間に、ユニオン変数のうちの1つだけが意味のある値を持ちます。最後に書き込まれたメンバーだけが読み取ることができます。この時点で、他の変数はガーベッジを含むことになります。アクティブな変数(つまり、最後にアクセスされた変数)を追跡するのはプログラマーの責任です。
従業員のレコードを受け入れ、表示する最良の方法は以下の通りです。
| | / 83_emp.c /
#include
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf(“\n従業員番号を入力してください : “); scanf(“%d”, &ue.eno);
printf(“\n%d”, ue.eno);
printf(“\n従業員名を入力してください : “); scanf(“%s”, ue.name);
printf(“\n%s”, ue.name);
printf(“\n従業員給与を入力してください : “); scanf(“%f”, &ue.sal);
printf(“\n%f”,ue.sal);
return 0;
} |
7. ユニオンのスコープ
ユニオンのスコープは構造体とは異なります。構造体変数は、その関数によってのみアクセスできます。一方、ユニオンとそのメンバーは、その関数によってアクセスできます。
| | / 84_scope.c /
#include
int main()
{
union
{
int i;
char c;
float f;
};
i = 10; c = ‘a’; f = 4.5; / ユニオンメンバー /
printf(“cの値は : %c”, c);
return 0;
} |
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。