共用體

共用體

在進行某些算法的C語言編程的時候,需要把幾種不同類型的變數存放到同一段記憶體單元中。也就是利用覆蓋技術,使幾個變數互相覆蓋。這種幾個不同的變數共同占用一段記憶體的結構類型,在C語言中,被稱作“共用體”類型結構,簡稱共用體。註:在某些書籍中可能稱之為“聯合體”,但是“共用體”更能反映該類型在記憶體的特點。

基本介紹

  • 中文名:共用體
  • 過程:在C語言中
  • 被稱作:“共用體”類型結構
  • 技術:使用覆蓋技術
定義,一般定義形式,簡單示例,引用方式,數據的特點,使用範例,

定義

一般定義形式

union 共用體名
{
成員表列
} 變數表列;

簡單示例

union data{    int i;    char ch;    float f;} a, b, c;

引用方式

只有先定義了共用體變數才能在後續程式中引用它,有一點需要注意:不能引用共用體變數,而只能引用共用體變數中的成員。
簡單示例
union data{    int i;    char ch;    float f;} a, b, c;
對於這裡定義的共用體變數a,b,c。下面的引用方式是正確的:
a.i (引用共用體變數中的整型變數i)
a.ch (引用共用體變數中的字元變數ch)
a.f (引用共用體變數中的實型變數f)
而不能引用共用體變數,例如:
printf("%d",a); <==這種用法是錯誤的。
因為a的存儲區內有好幾種類型的數據,分別占用不同長度的存儲區,這些共用體變數名a,難以使系統確定究竟輸出的是哪一個成員的值。
而應該寫成
printf("%d", a.i);
printf("%c", a.ch);

數據的特點

1.同一個記憶體段可以用來存放幾種不同類型的成員,但是在每一瞬間只能存放其中的一種,而不是同時存放幾種。換句話說,每一瞬間只有一個成員起作用,其他的成員不起作用,即不是每一個成員同時都在存在和起作用。
2.共用體變數中起作用的成員是最後一次存放的成員,在存入一個新成員後,原有成員就失去作用。
3.共用體變數的地址和它的各成員的地址都是同一地址。
4.不能對共用體變數名賦值,也不能通過引用變數名來得到一個值。
5.共用體類型可以出現在結構體類型的定義中,也可以定義共用體數組。反之,結構體也可以出現在共用體類型的定義中,數組也可以作為共用體的成員。
6.共用體變數的初始化。
(1)union data a=b; //把共用體變數初始化為另一個共用體
(2)union data a={123}; //初始化共用體為第一個成員
(3)union data a={.ch='a'}; //指定初始化項目,按照C99標準
7.共用體變數也可以作為函式的參數和返回值。
雖然很多教材上都說不可以,但是,至少VC++6.0都已經支持了,以下程式用於驗證:
#include <stdio.h>#include <string.h>typedef union{    int stu;    char tea[10];}DEP;DEP f(DEP d){    printf("函式調用成功\n");    return d;}int main(void){    DEP d, e;    strcpy(d.tea, "123");    printf("%s\n", d.tea);    e=f(d);    printf("%s\n", e.tea);    printf("函式返回值成功\n");    return 0;}

使用範例

例如:
main(){    union data    {        int a;        char b;    } data1;    data1.b = 'A';    data1.a++;    printf("%c\n", data1.b);}
共用體不同於結構體,會共有一處空間,對於其中一個成員的賦值,會影響到另一個成員,因此雖然是對data1.a++ (表示該值加1,由於該值共用data1.b,也即是 'A' +1 ,將會將字元A變為其ASCII碼再加1,也即是B)。所以最終結果是B。

相關詞條

熱門詞條

聯絡我們