共用体と構造体は何がちがうのかな?😊

ソーラー「共用体は構造体と同じく変数宣言を格納できてるね。


その変数宣言により作製された変数には数値を格納できるから


共用体は


数値の入れ物だというのは


わかったよ 


なんだ 簡単、簡単(^_-)-☆


数値の入れ物じゃなくて、なにかの共同体かとおもったよ」


アレサ「はい、共用体は難しい概念ではありません。


でも 構造体と違うところもありますの」


ソーラー「違うところ・・?


共用体を用いて数値1をとりこみ数値1を出力するプログラムは


構造体と全く同じだし


コンパイル結果も


全く同じだよね。」


#include <stdio.h>


union Kyouyoutai {

int a;

};

/*union Kyouyoutaiの共用体宣言*/


int main(void)

{

union Kyouyoutai Kyouyoutaihensuu;

/*Kyouyoutaihensuuの共用体変数宣言*/


Kyouyoutaihensuu.a=1;

/*共用体変数Kyouyoutaihensuuのメンバ変数Kyouyoutaihensuu.aに1を代入しました*/


printf("%d\n",Kyouyoutaihensuu.a);


/*メンバ変数Kyouyoutaihensuu.aをprintf関数の第2引数に書き込み

格納された数値を%d出力変換指定子をつかってprintf出力表示しました。*/


return 0;

}


コンパイル結果

1



この共用体を用いたプログラムをみてもわかるように


構造体のときと同じく


コンパイル結果は

1



構造体と共用体は全く同じ構造でコンパイル結果も同じ。


どこに違いがあるのか・・・???


う~む


アレサ これは一体ど^^いうこと(*´▽`*)」


アレサ

「 今のプログラムで共用体には


int a;


しか格納しませんでしたね」


ソーラー 「そう、そう そこが もったいないところだよね。


変数宣言

int a ;

だけでなく


int b;や


float c;などを


格納して もっと


数値を格納できるようにすればいいのに・・



おもうね。」


アレサ「今度は


union Kyouyoutaiの共用体宣言を行い


変数宣言

int a;

int b;


共用体 union Kyouyoutaiに格納してみます。


そして


共用体 union Kyouyoutai型のKyouyoutaihensuuの共用体変数宣言


union Kyouyoutai Kyouyoutaihensuu;


を行い


共用体変数Kyouyoutaihensuuを作製したあと


数値1,2を


共用体変数のメンバ変数となる

Kyouyoutaihensuu.a

Kyouyoutaihensuu.b

Kyouyoutaihensuu.a=1;

Kyouyoutaihensuu.b=2;


と格納し


数値1,2をprintf出力表示してみますね。


#include <stdio.h>


union Kyouyoutai {

int a;

int b;

};

/*union Kyouyoutaiの共用体宣言*/


int main(void)

{

union Kyouyoutai Kyouyoutaihensuu;

/*Kyouyoutaihensuuの共用体変数宣言*/


Kyouyoutaihensuu.a=1;

Kyouyoutaihensuu.b=2;

/*共用体変数Kyouyoutaihensuuのメンバ変数Kyouyoutaihensuu.aに1を代入しました

共用体変数Kyouyoutaihensuuのメンバ変数Kyouyoutaihensuu.bに2を代入しました

*/


printf("%d\n",Kyouyoutaihensuu.a);

printf("%d\n",Kyouyoutaihensuu.b);


return 0;

}

コンパイル結果

2

2



ソーラー「アレサ コンパイル結果が


1

2


じゃなくて


2

2

になってるよ。


なにかプログラムを書きまちがえてるのかな」


アレサ 「プログラムはまちがえていないんですの。


ソーラーさん これが共用体と構造体の違いとなります。


構造体では


int a;

int b;を


構造体にとりこんだ場合


構造体のメンバ変数aに数値1を

構造体のメンバ変数bに数値2を

代入したなら


その数値データは

別々の場所のメモリに格納されました。」


ソーラー 「そりゃ、そうだよね。


超基本的なことだよね~」


アレサ「ところが 共用体では


数値を格納するメモリの場所を


共用体変数のメンバ変数同士で共有するという仕組みがあり


最初に


共用体変数のメンバ変数aに格納されるデータをコンピュータのメモリの


ある場所に格納したなら


次に

共用体変数のメンバ変数bに格納されたデータは


最初に

共用体変数のメンバ変数aのデータを格納した、その同じメモリの場所に


上書きして格納され


共用体変数のメンバ変数aのデータは消えてしまいます。


そう、

共用体変数のメンバ変数aと

共用体変数のメンバ変数bの数値の格納されている場所は


共有されているのです。」


ソーラー「は?なんじゃ そりゃ~」


アレサ 「😊ですので このプログラムの場合


共用体変数のメンバ変数aと

共用体変数のメンバ変数bの数値を格納するメモリの場所は


共有されており


共用体変数のメンバ変数aに数値1を格納したメモリの場所に

共用体変数のメンバ変数bに格納された数値2が上書き格納されるので


共用体変数のメンバ変数aと

共用体変数のメンバ変数b


ともに

数値2は共有され


コンパイル結果は

2

2

となります。


そのことを確かめるために

今度は


int a;

int b;

int c;

int d;

int e;

を共用体union Kyouyoutaiに格納して


共用体union Kyouyoutai型の共用体変数Kyouyoutaihensuu


を作製し


共用体変数Kyouyoutaihensuuの各メンバ変数

Kyouyoutaihensuu.a

Kyouyoutaihensuu.b

Kyouyoutaihensuu.c

Kyouyoutaihensuu.d

Kyouyoutaihensuu.e

数値

1

2

3

4

5

を格納するプログラムを作成してみます。


#include <stdio.h>


union Kyouyoutai {

int a;

int b;

int c;

int d;

int e;

};


int main(void)

{

union Kyouyoutai Kyouyoutaihensuu;


Kyouyoutaihensuu.a=1;

Kyouyoutaihensuu.b=2;

Kyouyoutaihensuu.c=3;

Kyouyoutaihensuu.d=4;

Kyouyoutaihensuu.e=5;


printf("%d\n",Kyouyoutaihensuu.a);

printf("%d\n",Kyouyoutaihensuu.b);

printf("%d\n",Kyouyoutaihensuu.c);

printf("%d\n",Kyouyoutaihensuu.d);

printf("%d\n",Kyouyoutaihensuu.e);

return 0;

}

コンパイル結果

5

5

5

5

5


ソーラー「やっぱり そうなのか


共用体変数Kyouyoutaihensuuの各メンバ変数

Kyouyoutaihensuu.a

Kyouyoutaihensuu.b

Kyouyoutaihensuu.c

Kyouyoutaihensuu.d

Kyouyoutaihensuu.e


の数値データを格納する場所は共用されているので

各メンバ変数

Kyouyoutaihensuu.a

Kyouyoutaihensuu.b

Kyouyoutaihensuu.c

Kyouyoutaihensuu.d

Kyouyoutaihensuu.e


に格納される値は


最後に


共用体変数Kyouyoutaihensuuのメンバ変数eに


格納された数値5となり


コンパイル結果は

5

5

5

5

5

となるわけなんだね。」


アレサ 「そうなのです。


最後に共用体変数のメンバ変数に格納された数値を


全ての共用体変数のメンバ変数が共有するわけです。


ですので


次のプログラムのように

#include <stdio.h>


union Kyouyoutai {

int a;

int b;

int c;

int d;

int e;

};


int main(void)

{

union Kyouyoutai Kyouyoutaihensuu;


Kyouyoutaihensuu.a=1;

Kyouyoutaihensuu.b=2;


printf("%d\n",Kyouyoutaihensuu.a);

printf("%d\n",Kyouyoutaihensuu.b);

printf("%d\n",Kyouyoutaihensuu.c);

printf("%d\n",Kyouyoutaihensuu.d);

printf("%d\n",Kyouyoutaihensuu.e);

return 0;

}


コンパイル結果

2

2

2

2

2


共用体変数のメンバ変数bに数値データ2を格納した段階で


共用体変数のメンバ変数に数値データを格納するのを終えても


数値2は


全共用体変数のメンバ変数に共有されることになり


Kyouyoutaihensuu.a

Kyouyoutaihensuu.b

Kyouyoutaihensuu.c

Kyouyoutaihensuu.d

Kyouyoutaihensuu.e

はすべて

数値データ2

を格納することになり


コンパイル結果は

2

2

2

2

2

となります。」





  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます