構造体と共用体の違いがあることである:各メンバーの構造が異なるメモリを占有します、お互いに影響を与えません。と労働組合のすべてのメンバーが同じメモリセクションを占め、変更が他のメンバーのすべてのメンバーに影響を与えます。
消費メモリの合計以上のすべてのメンバーによって占められるメモリの構造は、(メンバーとの間に隙間があってもよい)、本体部材によって占められる共通のメモリは、メモリの最長の量に等しいです。組合は、新しいメンバーの割り当てが上書きされ、元メンバーの値を置く場合はメンバーにのみ、値を保持することができ、同じ時間をメモリカバーの技術を使用していました。
連合は、例えば、変数によって作成することができ、自己定義型、次のとおりです。
- 労働組合のデータ{
- int型のn ;
- 文字chを、
- ダブルF ;
- } 。
- 労働組合のデータ、B 、C ;
上記共通ボディを定義し、変数を作成し、変数が同時に共通のボディを作成するために定義することができます。
- 労働組合のデータ{
- int型のn ;
- 文字chを、
- ダブルF ;
- } A 、B 、C 。
新しい変数が定義されていない場合、労働組合は、名前を省略することができます。
- 組合{
- int型のn ;
- 文字chを、
- ダブルF ;
- } A 、B 、C 。
組合データ、Fメンバーの最大値によって占められるメモリは、8バイト、変数のデータ・タイプ(すなわち、A、B、C)は、次のプレゼンテーションを参照して、メモリの8つのバイトを占有します。
- 書式#include <stdio.hに>
- 労働組合のデータ{
- int型のn ;
- 文字chを、
- 短いM 。
- } 。
- INT メイン(){
- 労働組合のデータ。
- printf ("%d個、%d個の\ n " 、はsizeof (A )はsizeof (ユニオンデータ))。
- .N = 0x40の。
- printf ("%のXは、%C、%HX の\ n " 、.N 、.CH 、.M )。
- .CH = '9' 。
- printf ("%のXは、%C、%HX の\ n " 、.N 、.CH 、.M )。
- .M = 0x2059 ;
- printf ("%のXは、%C、%HX の\ n " 、.N 、.CH 、.M )。
- .N = 0x3E25AD54 。
- printf ("%のXは、%C、%HX の\ n " 、.N 、.CH 、.M )。
- リターン0 ;
- }
結果:
4,4 40、@、40 39、9、39 2059、Y、2059 3E25AD54、T、AD54
このコードはのみも記載組合の大きさは、組合部材との間の相互作用で検証されていない、メンバーの修正値は、他のメンバーに影響を与えます。
上記の出力を理解するために、正確にどのようにメンバー間の相互の影響を把握するには、メモリ内の個々のメンバーの分布を理解する必要があります。上記のデータは、例えば、メモリ内の個々のメンバー以下の分布:
メンバーは、CH、N - 、メモリに「整列」割当chが前バイト、M最初の2つの修飾の割り当てで変更するmはバイトは、n個の割り当てを変更することは全体のバイトです。これは、CH、mはn個のデータの一部に影響を与えますし、nすべてのデータCH、m個の影響を与えます。
図は、ほとんどのPCの上のメモリの分布である、それは51のシングルチップであれば、状況が異なることになります。
別のマシンには、それの異なる分布を持っているのはなぜ?ストレージモードに関連するこのマシンは、我々はVIPのチュートリアルになります「ビッグエンディアンとリトルエンディアンの差別はセクションを模索し始めました」。
労働組合の応用
連合はあまり多くのマイクロコントローラアプリケーションでは、一般的なプログラミングで使用されません。PCの場合は、頻繁に使用される例にある:教師に関する既存の学生情報や情報の形式。名前、メッセージ番号、性別、職業、名前、番号、性別、職業、教育科目を含め教師のスコアを含む、学生情報。次の表を考えてみます。
名 | A | 性別 | 職業 | スコア/コース |
---|---|---|---|---|
HanXiaoXiao | 501 | F | S | 89.5 |
YanWeiMin | 1011 | メートル | トン | 数学 |
LiuZhenTao | 109 | F | トン | 英語 |
ZhaoFeiYan | 982 | メートル | S | 95.0 |
fおよびmは、女性と男性は、sがtは教師を表し、学生を示しています。図から分かるように、データは、生徒と教師が異なる含まれています。今、同じテーブルにこの情報を必要とし、人事情報と設計プログラムの入力出力。
構造体変数として、各個人の情報ならば、変数の最初の4人のメンバーの教師と生徒が同じである、第五のメンバー変数は、スコアやコースもあります。変数が複数ある場合に第4部材の値は、第五の部材は、変数スコアである場合、第四のメンバー変数tの値が時間である場合、第五の部材は、可変コースです。
上記の分析の後、我々は一般的なメンバーを含む構造を設計することができ、次のコードを参照してください。
- 書式#include <stdio.hに>
- 書式#include <stdlib.h>に含ま
- TOTALの#define 4 名の合計数//
- 構造体{
- 文字名[ 20 ]。
- NUMのint ;
- char型性別;
- 文字職業;
- 組合{
- フロートスコア。
- チャーコース[ 20 ]。
- } SC 。
- }のbodys [TOTAL ]。
- INT メイン(){
- 私はint型。
- //入力された個人情報
- 以下のための(I = 0 ; iはTOTAL < ; iは++){
- printf ("入力情報:" );
- scanf関数("%sの%dの%Cは%のC" 、bodysの[I ] .nameの、&(のbodys [I ] .num )、 &(のbodys [I ] .sex )、 &(のbodys [I ] .profession )) ;
- IF (bodysの[I ] .profession == 'S' ){ //もし学生
- scanf関数("%のF" 、&bodysの[I ] .sc .score )。
- } 他{ //教師の場合
- scanf関数("%sの" 、のbodys [I ] .sc .course )。
- }
- fflush (STDIN )。
- }
- //出力人事情報
- printf (" \ nは名\ T \ T のNum \トンセックス\ tの職業の\トンのスコア/コース\ nを" );
- 以下のための(I = 0 ; iはTOTAL < ; iは++){
- IF (bodysの[I ] .profession == 'S' ){ //もし学生
- printf ("%sの\ T %D \ T %C \さt %のC \ T \ T %F \ n " 、のbodys [I ] .nameの、bodysの[I ] .num 、bodysの[I ] .sex 、bodysの[ I ] .profession 、bodysの[I ] .sc .score )。
- } 他{ //教師の場合
- printf ("%sの\ T %D \ T %C \さt %のC \ T \ T %S \ n " 、のbodys [I ] .nameの、bodysの[I ] .num 、bodysの[I ] .sex 、bodysの[ I ] .profession 、bodysの[I ] .sc .course )。
- }
- }
- リターン0 ;
- }
結果:
入力情報:HanXiaoXiao 501 fsの89.5↙ 入力情報:YanWeiMin 1011 MTmath↙ 入力情報:LiuZhenTao 109フィートEnglish↙ 入力情報:ZhaoFeiYan 982ミリ95.0↙ 名のNumセックス職業スコア/コース HanXiaoXiao 501のFS 89.500000 YanWeiMin 1011メートルの数学 LiuZhenTao 109フィート英語 ZhaoFeiYan 982ミリ95.000000