共用体と構造体は何がちがうのかな?😊
ソーラー「共用体は構造体と同じく変数宣言を格納できてるね。
その変数宣言により作製された変数には数値を格納できるから
共用体は
数値の入れ物だというのは
わかったよ
なんだ 簡単、簡単(^_-)-☆
数値の入れ物じゃなくて、なにかの共同体かとおもったよ」
アレサ「はい、共用体は難しい概念ではありません。
でも 構造体と違うところもありますの」
ソーラー「違うところ・・?
共用体を用いて数値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
となります。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます