C言語における構造体の共用体(Union of Structures)の概念をわかりやすく解説
C言語では、構造体(struct)を共用体(union)の中に入れ子として定義することができます。このように構造体が共用体の内部にネストされたものを「構造体の共用体」と呼びます。逆に、構造体の中に共用体を定義することも可能です。
共用体はすべてのメンバが同じメモリ領域を共有するため、サイズは最も大きいメンバのサイズと一致します。この特性により、異なるデータ型を効率的に扱うことができます。
例1:共用体内に構造体を定義する
以下は、共用体の中に構造体を定義したCプログラムの例です。共用体zの内部に構造体xを持たせ、ドット演算子を使って各メンバにアクセスしています。
#include<stdio.h>
struct x {
int a;
float b;
};
union z{
struct x s;
};
main ( ){
union z u;
u.s.a = 10;
u.s.b = 30.5;
printf("a=%d", u.s.a);
printf("b=%f", u.s.b);
getch ( );
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
a= 10 b = 30.5
例2:ポインタを使った共用体へのアクセス
次の例では、共用体abcがint型のaとchar型のbを持っています。ポインタ変数pを使って共用体のメンバにアクセスする方法と、sizeof演算子による共用体のサイズ確認方法を示しています。
#include<stdio.h>
union abc{
int a;
char b;
}v;
int main(){
v.a=90;
union abc *p=&v;
printf("a=%d\n",v.a);//90
printf("b=%c\n",v.b);//Z
printf("a=%d b=%c\n",p->a,p->b);//90 Z
printf("%d",sizeof(union abc));//4
return 0;
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
a=90 b=Z a=90 b=Z 4
解説のポイント
- メモリの共有:共用体
abcでは、int aに値90を代入すると、同じメモリ領域を共有しているchar bからはASCIIコード90に対応する文字「Z」として読み取られます。 - ポインタによるアクセス:アロー演算子(
->)を使えば、ポインタ経由でも共用体のメンバにアクセスできます。 - 共用体のサイズ:
sizeof(union abc)の結果は4です。これは、共用体のサイズが最も大きいメンバであるint型(4バイト)に等しいためです。
このように、構造体と共用体を組み合わせることで、メモリを効率的に利用しながら柔軟なデータ構造を設計することができます。
-
C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説
ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ
-
C#のクラスとは?基本概念からコンストラクタまで徹底解説
C#におけるクラスは、最も重要な型の一つです。クラスは、問題領域に関連するオブジェクトを生成するための「設計図」と考えることができます。つまり、クラスはテンプレートであり、そこからオブジェクトを作成します。クラスには、そのクラスから作られるオブジェクト群が共有する構造(データ)と振る舞い(メソッド)が定義されています。たとえるなら、クラスは「クッキーの型」であり、オブジェクトはその型で作られた「クッキー」そのものです。 カプセル化という重要な概念 クラスは、オブジェクト指向プログラミングにおける重要な概念である「カプセル化」を実現します。カプセル化とは、データと、そのデータを操作する処理を一箇