C言語には変数と呼ばれる変数がありunion
、さまざまな状況でさまざまな型やサイズのオブジェクトを格納するために使用されます。これは struct に非常に似ていますstruct
。struct は 1 つ以上の変数のコレクションです。
Union の宣言方法は非常に簡単で、struct
次のように Union の宣言方法とまったく同じです。
union u_tag {
int ival;
char *sval;
} u;
ご覧のとおり、唯一の違いは構造のstruct
変更ですunion
。
使用方法はまったく同じです。
//一般变量
union_name.val
//指针
union_pointer->val
この2つはとても似ていますが、この2つの違いは何でしょうか? 言い換えれば、なぜ同じようなものを 2 つ入手したいのでしょうか? C は C++ ではなく、一部の関数は異なるグループによって開発されており、一部の関数は重複します。
1つ目は表面的な違いで、使用目的とは全く異なりますが、struct
中括弧内のすべての変数を同時に格納するわけではないようです。union
union
struct
union u_tag {
int a;
int b;
} u;
int main()
{
u.a=1;
u.b=2;
printf("u_tag: %d\n", u.a);
return 0;
}
出力結果は次のようになります。
u_tag: 2
構造体のように前の出力union
に基づいていないため、ここでの結果は間違っていません。格納できるデータは 1 種類だけであるため、後者は元の格納値を上書きします。u.a=1
1
u.b=2
u
したがって、union
内部的に宣言された変数は、実際のオブジェクトやメンバー変数ではなく、可能性として理解できます。
また、union
内部には値が 1 つしかないため、通常は同じデータ型は使用されません。現在どのようなデータ型が含まれているかについては、プログラマがプログラミングする際に注意する必要があるものです。一般的には、変数を使用しu_type
、次に、現在含まれている型を判定ステートメントで判定します。
しかしstruct
、それはunion
コアとは異なり、union
その誕生の理由は、スペースを割り当てるメカニズムです。
sizeof()
以下の2つのデータのサイズを測定すると、
union u_tag {
int ival;
float fval;
char *sval;
} u;
struct s_tag {
int ival;
float fval;
char *sval;
} s;
u_tag
のサイズは 8 バイトですが、 のs_tag
サイズは 16 バイトであることがわかります。これは、union
内部的に宣言されたデータ型に対して最大のスペースを残しておきstruct
ながら。
現在のほとんどのマシンでは、int
タイプは 4 バイト、float
タイプは 4 バイト、cahr *
タイプは 8 バイトです。したがってu
、これは 8 バイトの最大のスペースを占有し、s
それぞれに独自のスペース (4+4+8=16 バイト) があります。
では、いつ使用する必要があるのでしょうかunion
?
まず、ある種のデータを保存するという特性により、浮動小数点数と整数の切り替えなど、一般的な計算を行うために使用できます。
第二に、上記の使用目的の下では、スペースの節約になります。この場合、構造体も使用できますが、上記の 3 つのデータ型のサイズが 2 倍のみである状況が適切であると考えられます。メモリ アドレス割り当てメカニズムにより、一部の種類のデータのアドレスが特別に必要になります (たとえば、一部のマシンではint
偶数桁のアドレスが必要です)。
以下は例ですが、整数アドレス制限は偶数ではなく、4 の倍数です。
struct s_tag {
int ival;
char a;
} s;
この構造体のサイズは 8 バイトです。このサイズかどうかを自分で試してみてください。
そして、コンパイラはシーケンシャルに読み取るので、次のように書くと、
struct s_tag {
int a;
char b;
int c;
char d;
} s;
この場合、この構造体のサイズは 16 バイトになります。この場合、次のように、同じタイプのデータをまとめて書き込むことで、スペースを節約できます。
struct s_tag {
int a;
int c;
char b;
char d;
} s;
このように、この構造体が占めるスペースは 12 バイトです。使用した場合union
、サイズは順序に関係なく常に 4 バイトになります。データ型の可能性が増えるにつれて、スペースを節約する必要性が明らかになります。
困っている方のお役に立てれば幸いです~