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

C語言共用體的作用

ber ons osi position 介紹 usart 老師 containe 女性

一、介紹

1、共用體(Union),它的定義格式為:

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

共用體有時也被稱為聯合或者聯合體,這也是 Union 這個單詞的本意。

2、結構體和共用體的區別在於:結構體的各個成員會占用不同的內存,互相之間沒有影響;而共用體的所有成員占用同一段內存,修改一個成員會影響其余所有成員。

結構體占用的內存大於等於所有成員占用的內存的總和(成員之間可能會存在縫隙),共用體占用的內存等於最長的成員占用的內存。共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。其實就是對一塊內存按照不同的數據類型分了幾個類別。可能一組時int型,一組時double型。

二、作用(單片機方面)

共用體在一般的編程中應用較少,在單片機中應用較多。對於 PC 機,經常使用到的一個實例是: 現有一張關於學生信息和教師信息的表格。學生信息包括姓名、編號、性別、職業、分數,教師的信息包括姓名、編號、性別、職業、教學科目。請看下面的表格:

Name Num Sex Profession Score / Course
HanXiaoXiao 501 f s 89.5
YanWeiMin 1011 m t math
LiuZhenTao 109 f t English
ZhaoFeiYan 982 m s 95.0

f 和 m 分別表示女性和男性,s 表示學生,t 表示教師。可以看出,學生和教師所包含的數據是不同的。現在要求把這些信息放在同一個表格中,並設計程序輸入人員信息然後輸出。

如果把每個人的信息都看作一個結構體變量的話,那麽教師和學生的前 4 個成員變量是一樣的,第 5 個成員變量可能是 score 或者 course。當第 4 個成員變量的值是 s 的時候,第 5 個成員變量就是 score;當第 4 個成員變量的值是 t 的時候,第 5 個成員變量就是 course。

經過上面的分析,我們可以設計一個包含共用體的結構體,請看下面的代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include <stdio.h> #include <stdlib.h> #define TOTAL 4 //人員總數 struct{ char name[20]; int num; char sex; char profession; union{ float score; char course[20]; } sc; } bodys[TOTAL]; int main(){ int i; //輸入人員信息 for(i=0; i<TOTAL; i++){ printf("Input info: "); 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); }else{ //如果是老師 scanf("%s", bodys[i].sc.course); } fflush(stdin); } //輸出人員信息 printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n"); for(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); }else{ //如果是老師 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); } } return 0; }

運行結果:

Input info: HanXiaoXiao 501 f s 89.5
Input info: YanWeiMin 1011 m t math
Input info: LiuZhenTao 109 f t English
Input info: ZhaoFeiYan 982 m s 95.0

Name Num Sex Profession Score / Course
HanXiaoXiao 501 f s 89.500000
YanWeiMin 1011 m t math
LiuZhenTao 109 f t English
ZhaoFeiYan 982 m s 95.000000

三、案例(嵌入式)

如下代碼利用重疊技術實現用UINT型對數組數據進行接收,然後再將其組合成浮點型(32位)數據進行幅值。

static union
{
    uint8_t data[24];
    float ActVal[6];
}posture;
        
 if(USART_GetITStatus(USART1, USART_IT_RXNE)==SET)   
{
    USART_ClearITPendingBit( USART1,USART_IT_RXNE);
    ch=USART_ReceiveData(USART1);
    posture.data[i] = ch;
    i++;
    if(i >= 24)
    {
        i = 0;
                break;
    }
    
}             
SetPositionX(posture.ActVal[3]);
SetPositionY(posture.ActVal[4]);
SetAngle(posture.ActVal[0]);
    

C語言共用體的作用