1. 程式人生 > >C語言:共用體

C語言:共用體

原文連結:http://blog.csdn.net/juanjuan888/article/details/6634350

定義

使幾個不同的變數共佔同一段記憶體的結構稱為 “共用體”型別的結構.

定義共用體型別變數:
union 共用體名
              {          
                        成員表列
                }變量表列;

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

  或 

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

共用體和結構體的比較:
(1)結構體變數所佔記憶體長度是各成員佔的記憶體長度之和。每個成員分別佔有其自己的記憶體單元。
(2)共用體變數所佔的記憶體長度等於最長的成員的長度。

共用體引用

只有先定義了共用體變數才能引用它,而且不能引用共用體變數,而只能引用共用體變數中的成員。

共用體型別資料的特點

(1)同一個記憶體段可以用來存放幾種不同型別的成員,但在每一瞬時只能存放其中一種,而不是同時存放幾種。

(2) 共用體變數中起作用的成員是最後一次存放的成員,在存入一個新的成員後原有的成員就失去作用。 

(3) 共用體變數的地址和它的各成員的地址都是同一地址。

(4) 不能對共用體變數名賦值,也不能企圖引用變數名來得到一個值,又不能在定義共用體變數時對它初始化。

(5) 不能把共用體變數作為函式引數,也不能使函式帶回共用體變數,但可以使用指向共用體變數的指標 

(6) 共用體型別可以出現在結構體型別定義中,也可以定義共用體陣列。反之,結構體也可以出現在共用體型別定義中,陣列也可以作為共用體的成員

應用:

#include <stdio.h>
 struct
 {
 int num;
 char name[10];
 char sex;
 char job;
 union
 {
  int banji;
  char position[10];
 }category;
 }person[2];     //先設人數為2
void main()
{
   int i;
   for(i=0;i<2;i++)
   {
    scanf("%d %s %c %c", &person[i].num, &person[i].name,&person[i].sex, &person[i].job);
    if(person[i].job == 'S')
          scanf("%d", &person[i].category.banji);
    else if(person[i].job == 'T')
             scanf("%s", person[i].category.position);
    else
    printf(“Input error!”);
   }
   printf("\n");
    printf("No. name sex job class/position\n");
    for(i=0;i<2;i++)
    {
         if (person[i].job == 'S')
                printf(“%-6d%-10s%-3c%-3c%-6d\n”,person[i].num,  person[i].name, person[i].sex, person[i].job,  person[i].category.banji);
        else 
              printf(“%-6d%-10s%-3c%-3c%-6s\n”,person[i].num, 
               person[i].name,person[i].sex, person[i].job, 
                   person[i].category.position);
   }
}