Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語におけるユニオンとポインタの使い方を徹底解説


ユニオン(共用体)とは、異なるデータ型を持つ複数の変数が、同一のメモリ領域を共有するための仕組みです。構造体が各メンバーごとに独立したメモリを割り当てるのに対し、ユニオンではすべてのメンバーが同じアドレスを参照するという点が大きな特徴です。

ユニオンの構文

ユニオンを定義するときの基本的な書式は次の通りです。

union タグ名{
    データ型 メンバー1;
    データ型 メンバー2;
    ----
    ----
    データ型 メンバーn;
};

実際の記述例を見てみましょう。

union sample{
    int a;
    float b;
    char c;
};

ユニオン変数の宣言

ユニオン変数を宣言する方法は、主に以下の3通りがあります。

方法1:定義と同時に変数を宣言する

union sample{
    int a;
    float b;
    char c;
}s;

方法2:タグ名のない無名ユニオンとして宣言する

union {
    int a;
    float b;
    char c;
}s;

方法3:定義後に別途変数を宣言する

union sample{
    int a;
    float b;
    char c;
};
union sample s;

ユニオンが宣言されると、コンパイラは自動的に、そのユニオン内で最もサイズの大きいデータ型を格納できるだけのメモリを確保します。また、任意の時点で参照できるのは必ず1つのメンバーだけである点に注意してください。

初期化とメンバーへのアクセス

  • ユニオンのメンバーへのアクセス方法は、構造体の場合とまったく同じです。
  • 通常はドット演算子(.)を使用してメンバーにアクセスします。
  • ポインタ経由でメンバーにアクセスする場合は、アロー演算子(->)を使用します。
  • ユニオンで使用できるデータ型に特別な制限はありません。

サンプルプログラム

続いて、ポインタを使ってユニオンにアクセスするC言語プログラムの例を紹介します。

#include<stdio.h>
union abc{
    int a;
    char b;
};
int main(){
    union abc var;
    var.a=90;
    union abc *p=&var;
    printf("%d%c",p->a,p->b);
}

実行結果

上記のプログラムをコンパイルして実行すると、次のような出力が得られます。

90Z

解説:このプログラムでは、まず var.a に整数値90を代入しています。その後、ポインタ p を使って p->ap->b の両方を出力しています。ユニオンのメンバーは同じメモリ領域を共有しているため、整数の90はASCIIコードで文字「Z」に相当し、%d では「90」、%c では「Z」と表示されるのです。これは、ユニオンがメモリを共有する仕組みを示す好例と言えるでしょう。


  1. C言語のポインタ配列とは?宣言・初期化・アクセス方法を実例付きで解説

    ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる メモリ位置へ直接アクセスするため、実行速度が速い メモリを効率的に利用でき、動的な割り当て(確保)と解放が可能 リンクリストやツリーなどのデータ構造と組み合わせて使用できる ポインタの宣言と初期化 まず、次のような文を考えてみましょう。 int qty = 179; このとき、変数はメモリ上に値「179」とそのアドレスを持つ形で表現されます。 ポインタの宣言 ポ

  2. C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説

    ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ