【C言語】第6章第12回:共用体(union)の基本と使用例
共用体(union)は、複数のメンバーが同じメモリ領域を共有するデータ構造です。この章では、共用体の基本的な使い方と応用例について学びます。
0. 記事の概要
この記事を読むメリット
- メモリ効率の向上:共用体を活用することで、メモリ使用量を最小限に抑える方法を学べます。
- 構造体との違いの理解:構造体と共用体の違いを明確に理解できます。
- 応用力の向上:共用体を使った実践的なプログラムの作成方法を学べます。
この記事で学べること
- 共用体の定義と基本的な使い方
- 構造体との違いと比較
- 共用体の応用例とそのメリット
活用のイメージ
例えば、センサーから取得する複数のデータ型(整数、浮動小数点、文字列)を1つの共用体で管理することで、効率的なメモリ使用が可能になります。本記事を通じて、共用体の基本と応用を習得しましょう。
1. 共用体(union)の基本
1.1 共用体とは?
共用体は、複数のメンバーが1つのメモリ領域を共有するデータ構造です。共用体のメンバーは、**同時に1つだけ有効**になります。
1.2 共用体の基本的な定義
#include <stdio.h>
// 共用体の定義
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
// 整数値を格納
data.i = 10;
printf("Integer: %d\n", data.i);
// 浮動小数点を格納
data.f = 220.5;
printf("Float: %.2f\n", data.f);
// 文字列を格納
sprintf(data.str, "Hello");
printf("String: %s\n", data.str);
return 0;
}
動作説明
- 共用体の定義:
union Data
を定義し、整数、浮動小数点、文字列をメンバーとして含めます。 - データの格納と表示:
- 整数、浮動小数点、文字列を順に共用体に格納し、それぞれの値を出力します。
- 最後に格納したデータだけが有効になります。
1.3 構造体との違い
構造体 | 共用体 |
---|---|
各メンバーが独自のメモリ領域を持つ | すべてのメンバーが同じメモリ領域を共有 |
全メンバーを同時に利用可能 | 1つのメンバーしか有効ではない |
メモリ使用量は全メンバーの合計 | メモリ使用量は最も大きいメンバーに依存 |
2. 共用体の応用例
2.1 センサーデータの管理
#include <stdio.h>
// センサーデータを表す共用体
union SensorData {
int intData;
float floatData;
char strData[20];
};
int main() {
union SensorData sensor;
// 整数データを格納
sensor.intData = 100;
printf("Integer Data: %d\n", sensor.intData);
// 浮動小数点データを格納
sensor.floatData = 75.25;
printf("Float Data: %.2f\n", sensor.floatData);
return 0;
}
動作説明
- 共用体の定義:センサーから取得する整数、浮動小数点、文字列データを格納できる共用体を定義します。
- データの格納と表示:
- 整数データを格納して出力します。
- 次に浮動小数点データを格納して出力します。
2.2 メモリ効率の比較
共用体を使用すると、構造体に比べてメモリ使用量が大幅に削減されます。以下は例として、構造体と共用体のメモリサイズを比較したコードです。
#include <stdio.h>
// 構造体の定義
struct StructData {
int i;
float f;
char str[20];
};
// 共用体の定義
union UnionData {
int i;
float f;
char str[20];
};
int main() {
printf("Size of StructData: %zu bytes\n", sizeof(struct StructData));
printf("Size of UnionData: %zu bytes\n", sizeof(union UnionData));
return 0;
}
動作説明
- 構造体と共用体の定義:同じメンバーを持つ構造体と共用体を定義します。
- メモリサイズの比較:
sizeof
を使い、それぞれのメモリサイズを出力します。
3. 練習問題
以下の課題に挑戦して、共用体の理解を深めましょう。
- 共用体を使用して、異なる型のセンサーデータを効率的に管理するプログラムを作成してください。
- 構造体と共用体のメモリ使用量を比較し、それぞれのメリットを説明するプログラムを作成してください。
- 共用体を使ってデータ型に応じた値を動的に出力するプログラムを作成してください。
4. 練習問題の解答と解説
問1の解答
#include <stdio.h>
// センサーデータを表す共用体
union SensorData {
int intData;
float floatData;
char strData[20];
};
int main() {
union SensorData sensor;
// 整数データを格納
sensor.intData = 100;
printf("Integer Data: %d\n", sensor.intData);
// 浮動小数点データを格納
sensor.floatData = 75.25;
printf("Float Data: %.2f\n", sensor.floatData);
// 文字列データを格納
sprintf(sensor.strData, "Hello");
printf("String Data: %s\n", sensor.strData);
return 0;
}
動作説明
- 共用体の定義:センサーから取得する複数の型のデータを格納する共用体を定義します。
- データの格納と表示:
- 整数データ、浮動小数点データ、文字列データを順に格納し、それぞれの値を出力します。
5. まとめ
共用体を活用することで、メモリ使用量を最小限に抑えつつ、効率的なデータ管理が可能になります。次回は、共用体の応用例についてさらに深く学びます。