1.?聯合說明和聯合變量定義?
聯合也是一種新的數據類型,?它是一種特殊形式的變量。?
聯合說明和聯合變量定義與結構十分相似。其形式為:?
union?聯合名{?
數據類型?成員名;?
數據類型?成員名;?
...?
}?聯合變量名;?
聯合表示幾個變量公用一個內存位置,?在不同的時間保存不同的數據類型?和不同長度的變量。?
下例表示說明一個聯合a_bc:?
union?a_bc{?
int?i;?
char?mm;?
};?
再用已說明的聯合可定義聯合變量。?
例如用上面說明的聯合定義一個名為lgc的聯合變量,?可寫成:?
union?a_bc?lgc;?
在聯合變量lgc中,?整型量i和字符mm公用同一內存位置。?
當一個聯合被說明時,?編譯程序自動地產生一個變量,?其長度為聯合中最大的變量長度。?
聯合訪問其成員的方法與結構相同。同樣聯合變量也可以定義成數組或指針,但定義為指針時,?也要用" ->;"符號,?此時聯合訪問成員可表示成:?
聯合名->成員名?
另外,?聯合既可以出現在結構內,?它的成員也可以是結構。?
例如:?
struct{?
int?age;?
char?*addr;?
union{?
int?i;?
char?*ch;?
}x;?
}y[10];?
若要訪問結構變量y[1]中聯合x的成員i,?可以寫成:?
y[1].x.i;?
若要訪問結構變量y[2]中聯合x的字符串指針ch的第一個字符可寫成:?
*y[2].x.ch;?
若寫成"y[2].x.*ch;"是錯誤的。?
2.?結構和聯合的區別?
結構和聯合有下列區別:?
1) 結構和聯合都是由多個不同的數據類型成員組成,?但在任何同一時刻,? 聯合轉只存放了一個被選中的成員,?而 結構的所有成員都存在。?
2) 對于聯合的不同成員賦值,?將會對其它成員重寫,?? 原來成員的值就不存在了,? 而對于結構的不同成員賦值是互不影響的。?
下面舉一個例了來加對深聯合的理解。?
main()?
{?
union{???????????????????/*定義一個聯合*/?
int?i;?
struct{?????????????/*在聯合中定義一個結構*/?
char?first;?
char?second;?
}half;?
}number;?
number.i=0x4241;?????????/*聯合成員賦值*/?
printf("%c%c\n",?number.half.first,?mumber.half.second);?
number.half.first='a';???/*聯合中結構成員賦值*/?
number.half.second='b';?
printf("%x\n",?number.i);?
getch();?
}?
輸出結果為:?
AB?
6261?
從上例結果可以看出:?當給i賦值后,?其低八位也就是first和second的值;當給first和second賦字符后,?這兩個字符的ASCII碼也將作為i?的低八位和高八位。
聯合也是一種新的數據類型,?它是一種特殊形式的變量。?
聯合說明和聯合變量定義與結構十分相似。其形式為:?
union?聯合名{?
數據類型?成員名;?
數據類型?成員名;?
...?
}?聯合變量名;?
聯合表示幾個變量公用一個內存位置,?在不同的時間保存不同的數據類型?和不同長度的變量。?
下例表示說明一個聯合a_bc:?
union?a_bc{?
int?i;?
char?mm;?
};?
再用已說明的聯合可定義聯合變量。?
例如用上面說明的聯合定義一個名為lgc的聯合變量,?可寫成:?
union?a_bc?lgc;?
在聯合變量lgc中,?整型量i和字符mm公用同一內存位置。?
當一個聯合被說明時,?編譯程序自動地產生一個變量,?其長度為聯合中最大的變量長度。?
聯合訪問其成員的方法與結構相同。同樣聯合變量也可以定義成數組或指針,但定義為指針時,?也要用" ->;"符號,?此時聯合訪問成員可表示成:?
聯合名->成員名?
另外,?聯合既可以出現在結構內,?它的成員也可以是結構。?
例如:?
struct{?
int?age;?
char?*addr;?
union{?
int?i;?
char?*ch;?
}x;?
}y[10];?
若要訪問結構變量y[1]中聯合x的成員i,?可以寫成:?
y[1].x.i;?
若要訪問結構變量y[2]中聯合x的字符串指針ch的第一個字符可寫成:?
*y[2].x.ch;?
若寫成"y[2].x.*ch;"是錯誤的。?
2.?結構和聯合的區別?
結構和聯合有下列區別:?
1) 結構和聯合都是由多個不同的數據類型成員組成,?但在任何同一時刻,? 聯合轉只存放了一個被選中的成員,?而 結構的所有成員都存在。?
2) 對于聯合的不同成員賦值,?將會對其它成員重寫,?? 原來成員的值就不存在了,? 而對于結構的不同成員賦值是互不影響的。?
下面舉一個例了來加對深聯合的理解。?
main()?
{?
union{???????????????????/*定義一個聯合*/?
int?i;?
struct{?????????????/*在聯合中定義一個結構*/?
char?first;?
char?second;?
}half;?
}number;?
number.i=0x4241;?????????/*聯合成員賦值*/?
printf("%c%c\n",?number.half.first,?mumber.half.second);?
number.half.first='a';???/*聯合中結構成員賦值*/?
number.half.second='b';?
printf("%x\n",?number.i);?
getch();?
}?
輸出結果為:?
AB?
6261?
從上例結果可以看出:?當給i賦值后,?其低八位也就是first和second的值;當給first和second賦字符后,?這兩個字符的ASCII碼也將作為i?的低八位和高八位。