構造体について
union
unionは定義の定義の方法や使用方法を見ただけでは構造体と変わりません。このなることは、全メンバが指す先頭アドレスが同じということです。構造体の場合には、メモリ上では1つめのメンバのあとに2つめのメンバが並ぶということで、先頭アドレスは各々で異なります。
union data {
int i;
double d;
char *s;
};
このように、定義の方法は構造体の定義の「struct」が「union」に変わっただけです。
union data d;
d.int = 0;
実際に使用する場合にも構造体と文言が変わるだけです。先頭のアドレスが同じというのはどういうことなのでしょうか?つまり、メンバ名自体は異なりますが、同じ領域を共有しているということです。もちろん、変数の型によって領域の大小があるため、サイズが小さい変数は全部の領域を使ってはいません。これまでの話を理解した方には、「union定義されたものは、メンバの一番大きい物のサイズになる」と考えた方もおられるでしょう。でも実際には、環境によってそうならない場合があります。実際にサイズを知りたい場合には、sizeof演算子で確認する必要があるでしょう。
変数同士ではあまりメリットが感じられませんが、構造体の場合にはメンバの配置やサイズを考えて設定することにより、データの区切り目や扱うデータ長を変えられるため重宝します。構造体では、char a[16]と定義されていたものをunionによってchar b[10]とchar c[6]というように細分化する事も出来ます。また、構造体と同じくポインタなども使うことが出来るため、構造体と親和性が高い仕組みといえるでしょう。