共用体は構造体のそっくりさんです

アレサ「数値、文字データのいれものとして


変数

配列

構造体

構造体の配列さんたちがおられました。


今日は そのお仲間として共用体さんに御登場いただきます。


それでは、 どうぞ


ささ、どうぞ」


共用体「よばれて とびでて 共用体ぃぃぃ~~んん」


アレサ「ようこそ 共用体さん


それでは


数値のいれものである


共用体さんがどのような仕組みとなっているかを


みていきますね。


共用体は構造体に非常にそっくりさんなんです。


共用体に変数をメンバ変数として格納する仕組みも


共用体の記述方法も


共用体変数宣言をおこない


共用体変数のメンバ変数に格納した数値データをprintf出力する方法も


構造体のときと全く同じです。」


ソーラー「まったく同じ\(^o^)/


ラッキー😊」


アレサ「はい、以下の共用体の説明は


構造体の説明と全く同じです


共用体は


構造体と同じく


複数のさまざまな型の変数を格納することができる


プログラマの方が自作する


数値、文字データのいれもののことです。


共用体宣言を行ったあと


共用体変数宣言を

おこなうと


共用体変数が作成されます。


構造体のときと同じく


共用体変数には


共用体のメンバ変数が存在します。


構造体の時と同じく  ふふっ


そうして作製された


共用体変数のメンバ変数に数値を入して


格納していくことになります



共用体宣言は以下の命令文


union 共用体名{


格納する変数の型 変数;

格納する変数の型 変数;

格納する変数の型 変数;

};


をもちいて記述されます。


具体的な例として


まずは1つ共用体を作製してみましょう。


共用体名を


Kyouyoutaiとし


int型の変数a

float型の変数b


を共用体に格納するには


以下のように


共用体宣言をおこないます


union Kyouyoutai{

int a;

float b;

};


この共用体宣言により


union Kyouyoutaiという共用体が作製されます


そうして union Kyouyoutaiという共用体が作製されたわけですが


作製された


共用体union Kyouyoutaiはそのままではつかえません。


構造体の時と同じく


まず、共用体union Kyouyoutai型の


Kyouyoutaihennsuuの共用体変数宣言を行い


共用体変数Kyouyoutaihennsuuを作製する必要があります。


共用体変数宣言はつぎのように記述されます。


union  共用体名 共用体変数名; 


共用体名がKyouyoutai

共用体変数名がKyouyoutaihennsuuなら


共用体変数宣言は 次のように記述されます。


union Kyouyoutai Kyouyoutaihennsuu;


そうして


できた共用体変数kyouyoutaihennsuu


には次のように

                     

共用体のメンバ変数

a

b


ドット演算子を作用させた

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


kyouyoutaihennsuu.a

kyouyoutaihennsuu.b



が存在します


こうして作製された


Kyouyoutaihennsuu.aにint aに代入される数値を

Kyouyoutaihennsuu.bにfloat bに代入される数値を


格納していくわけです。


共用体union Kyouyoutaiのメンバ変数は

a

b



共用体変数kyouyoutaihennsuuのメンバ変数は

Kyouyoutaihennsuu.a

Kyouyoutaihennsuu.b


となっています まちがえやすいかもしれません。」



ソーラー「つまり共用体変数kyouyoutaihennsuuを作製して


共用体変数kyouyoutaihennsuuのメンバ変数に数値を格納していくってわけだね。」


アレサ「実際に


今までの流れをプログラムを構成してみていきましょう。


この度は


共用体 union Kyouyoutaiに


変数宣言


             int a;

のみ


格納していきます。」


ソーラー「アレサ、共用体 union Kyouyoutaiに格納するのは


int a;

だけ・・・なの?


もっと こう


int b;

とか

floatc;

とか


格納してこないの?」


アレサ「はいっ😊 そうなのです。


これは 構造体と共用体の違いにかかわっていますの。」


ソーラー「そうなんだ~ ???」


アレサ「はいっ、それでは プログラムを構成していきます


#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


アレサ「いかがでしょうか? ソーラーさん😊」


ソーラー「

共用体変数Kyouyoutaihensuuの

メンバ変数Kyouyoutaihensuu.aに格納された数値1を


printf出力表示するには


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


を記述するんだね


よくみると


このプログラム、構造体のときのプログラムと


構造は全く一緒だね。」


アレサ「


構造体Kouzoutaiに int aを取り込むプログラムは


次のようにあらわされました。


#include <stdio.h>


struct Kouzoutai {

int a;

};

/*struct Kouzoutaiの構造体宣言*/


int main(void)

{

struct Kouzoutai Kouzoutaihensuu;

/*Kouzoutaihensuuの構造体変数宣言*/


Kouzoutaihensuu.a=1;

/*構造体変数Kouzoutaihensuuのメンバ変数Kouzoutaihensuu.aに1を代入しました*/


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


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

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


return 0;

}

コンパイル結果

1


ソーラー「ほんと全く同じだね。


共用体と構造体って、どこがちがうのかな?」

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

作者を応援しよう!

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

応援したユーザー

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