C言語

【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;
}
動作説明
  1. 共用体の定義:union Dataを定義し、整数、浮動小数点、文字列をメンバーとして含めます。
  2. データの格納と表示:
    • 整数、浮動小数点、文字列を順に共用体に格納し、それぞれの値を出力します。
    • 最後に格納したデータだけが有効になります。

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;
}
動作説明
  1. 共用体の定義:センサーから取得する整数、浮動小数点、文字列データを格納できる共用体を定義します。
  2. データの格納と表示:
    • 整数データを格納して出力します。
    • 次に浮動小数点データを格納して出力します。

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;
}
動作説明
  1. 構造体と共用体の定義:同じメンバーを持つ構造体と共用体を定義します。
  2. メモリサイズの比較:sizeofを使い、それぞれのメモリサイズを出力します。

3. 練習問題

以下の課題に挑戦して、共用体の理解を深めましょう。

  1. 共用体を使用して、異なる型のセンサーデータを効率的に管理するプログラムを作成してください。
  2. 構造体と共用体のメモリ使用量を比較し、それぞれのメリットを説明するプログラムを作成してください。
  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;
}
動作説明
  1. 共用体の定義:センサーから取得する複数の型のデータを格納する共用体を定義します。
  2. データの格納と表示:
    • 整数データ、浮動小数点データ、文字列データを順に格納し、それぞれの値を出力します。

5. まとめ

共用体を活用することで、メモリ使用量を最小限に抑えつつ、効率的なデータ管理が可能になります。次回は、共用体の応用例についてさらに深く学びます。