0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

c語(yǔ)言中結(jié)構(gòu)體有聯(lián)合體的區(qū)別

嵌入式應(yīng)用開(kāi)發(fā) ? 來(lái)源:嵌入式應(yīng)用開(kāi)發(fā) ? 作者:嵌入式應(yīng)用開(kāi)發(fā) ? 2022-12-03 14:25 ? 次閱讀

結(jié)構(gòu)體、聯(lián)合體是C語(yǔ)言中的構(gòu)造類型,結(jié)構(gòu)體我們平時(shí)應(yīng)該都用得很多。但是,對(duì)于聯(lián)合體,一些初學(xué)的朋友可能用得并不多,甚至感到陌生。我們先來(lái)簡(jiǎn)單看一下聯(lián)合體:

union 聯(lián)合名
{
成員表
};

成員表中含有若干成員,成員的一般形式為:類型說(shuō)明符 成員名。其占用的字節(jié)數(shù)與成員中最大數(shù)據(jù)類型占用的字節(jié)數(shù)。

下面用代碼進(jìn)行理解:

enum DATA_PKG_TYPE
{
    DATA_PKG1 = 1,
    DATA_PKG2,
    DATA_PKG3    
};

struct data_pkg1
{
    // ...
};

struct data_pkg2
{
    // ...
};

struct data_pkg3
{
    // ...
};

struct data_pkg
{
    enum DATA_PKG_TYPE data_pkg_type;
    union 
    {
       struct data_pkg1 data_pkg1_info;
       struct data_pkg2 data_pkg2_info;
       struct data_pkg3 data_pkg3_info;
    }data_pkg_info;
};

把struct data_pkg1、struct data_pkg2、struct data_pkg3三個(gè)結(jié)構(gòu)體放到了struct data_pkg這個(gè)結(jié)構(gòu)體里進(jìn)行管理,把data_pkg_type與union里的三個(gè)結(jié)構(gòu)體建立一一對(duì)應(yīng)關(guān)系,我們需要用哪一結(jié)構(gòu)體數(shù)據(jù)就通過(guò)data_pkg_type來(lái)進(jìn)行選中。

在進(jìn)行數(shù)據(jù)組包的時(shí)候,先給data_pkg_type進(jìn)行賦值,確定數(shù)據(jù)包的類型,再給對(duì)應(yīng)的union里的結(jié)構(gòu)體進(jìn)行賦值;在進(jìn)行數(shù)據(jù)解析的時(shí)候,通過(guò)data_pkg_type來(lái)選擇解析哪一組數(shù)據(jù)。

poYBAGOJ98iAQ1WEAAEwqauSLcU443.png

結(jié)構(gòu)體部分:

#define BUF_SIZE 16
union protocol_data
{
 uint8_t data_buffer[BUF_SIZE];
 struct 
 {
  uint8_t data1;
  uint8_t data2;
  uint8_t data3;
  uint8_t data4;
  // ...
 }data_info;
};

struct里面的內(nèi)容可以設(shè)計(jì)得很簡(jiǎn)單,比如全是有用的數(shù)據(jù),或是設(shè)計(jì)得很復(fù)雜,包含一些協(xié)議頭尾、包長(zhǎng)、有效數(shù)據(jù)、校驗(yàn)等內(nèi)容。

但無(wú)論如何,我們組包發(fā)送的過(guò)程是填充結(jié)構(gòu)體->發(fā)送data_buffer;反之接收數(shù)據(jù)解析的過(guò)程就是接收數(shù)據(jù)存于data_buffer->使用結(jié)構(gòu)體數(shù)據(jù)

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73538
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134090
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    10800
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言聯(lián)合體的巧妙運(yùn)用

    聯(lián)合體(Union)是C語(yǔ)言中的一種復(fù)合類型,它允許在同一內(nèi)存區(qū)域存儲(chǔ)多個(gè)不同的數(shù)據(jù)類型的成員(member),但只能同時(shí)存在其中一個(gè)成員。
    發(fā)表于 06-21 10:59 ?1628次閱讀

    430編程C語(yǔ)言常識(shí)(IAR)之結(jié)構(gòu)聯(lián)合體

      結(jié)構(gòu)聯(lián)合體C語(yǔ)言的常見(jiàn)數(shù)據(jù)類型,可對(duì)C的基本數(shù)據(jù)類型進(jìn)行組合使之能表示復(fù)雜的數(shù)據(jù)
    發(fā)表于 11-22 15:43

    DLL導(dǎo)入結(jié)構(gòu) 聯(lián)合體

    DLL函數(shù)參數(shù)中,結(jié)構(gòu)聯(lián)合體,結(jié)構(gòu)中使用聯(lián)合體
    發(fā)表于 09-06 10:32

    聯(lián)合體問(wèn)題

    union U1{INT8Uax[4];FP32 fx;INT32Slx;INT32Uulx;INT16Six;INT16Uuix;INT8Scx;INT8Uucx;};U1 X_rom;//申請(qǐng)聯(lián)合接口數(shù)據(jù)變量定義如上的一個(gè)聯(lián)合體
    發(fā)表于 01-04 12:13

    如何定義了這個(gè)聯(lián)合體?

    我先定義一個(gè)聯(lián)合體數(shù)據(jù)類型,然后接著定義了一些聯(lián)合體變量,定義聯(lián)合體部分如下:我在sys_config.c文件中定義如下聯(lián)合體數(shù)據(jù)類型和變量
    發(fā)表于 07-12 04:28

    為什么位域結(jié)構(gòu)聯(lián)合體一起使用?

    /*本例程是C語(yǔ)言的位域操作示例這里為什么位域結(jié)構(gòu)聯(lián)合體一起使用?-->因?yàn)檫@樣定義后,即可以單獨(dú)使用標(biāo)志位 也可同時(shí)使用整個(gè)字節(jié)數(shù)據(jù)主
    發(fā)表于 07-14 06:23

    結(jié)構(gòu)與共用區(qū)別

    語(yǔ)言中,還有另外一種和結(jié)構(gòu)非常類似的語(yǔ)法,叫做共用(Union),它的定義格式為:union 共用名{成員列表};共用
    發(fā)表于 07-20 06:57

    結(jié)構(gòu)聯(lián)合體區(qū)別到底在哪里

    在單片機(jī)軟件編程中,結(jié)構(gòu)和枚舉類型都很常用到,聯(lián)合體相對(duì)來(lái)用的就比較少。那么結(jié)構(gòu)聯(lián)合體
    發(fā)表于 11-22 07:54

    如何利用聯(lián)合體去判斷大小端呢

    轉(zhuǎn)載,如若侵權(quán),請(qǐng)聯(lián)系本人刪除。聯(lián)合體定義聯(lián)合體結(jié)構(gòu)一樣都是自定義類型。聯(lián)合體也包含一系列成員,但是和
    發(fā)表于 12-15 07:21

    聯(lián)合體/共用的使用方法

    大家好,我是ZhengN。本次給分享聯(lián)合體的一些知識(shí)。聯(lián)合體/共用的使用 C語(yǔ)言中,聯(lián)合體/共
    發(fā)表于 02-28 10:05

    結(jié)構(gòu)struct和聯(lián)合體union的區(qū)別?

    結(jié)構(gòu)struct和聯(lián)合體union的區(qū)別?
    發(fā)表于 10-11 08:21

    C語(yǔ)言結(jié)構(gòu)聯(lián)合體嵌套使用的實(shí)用操作

    ? 結(jié)構(gòu)、聯(lián)合體C語(yǔ)言中的構(gòu)造類型,結(jié)構(gòu)我們平
    的頭像 發(fā)表于 12-24 16:07 ?5374次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>、<b class='flag-5'>聯(lián)合體</b>嵌套使用的實(shí)用操作

    什么是C語(yǔ)言聯(lián)合體

    名{ 成員列表 }; 共用有時(shí)也被稱為聯(lián)合或者聯(lián)合體,這也是 Union 這個(gè)單詞的本意。 結(jié)構(gòu)
    的頭像 發(fā)表于 07-29 15:35 ?3572次閱讀
    什么是<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>聯(lián)合體</b>

    看一下結(jié)構(gòu)、聯(lián)合體結(jié)合使用在C語(yǔ)言與嵌入式中的一些實(shí)用技巧

    結(jié)構(gòu)聯(lián)合體C語(yǔ)言中的構(gòu)造類型,結(jié)構(gòu)我們平時(shí)應(yīng)
    發(fā)表于 05-08 10:19 ?4143次閱讀
    看一下<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>、<b class='flag-5'>聯(lián)合體</b>結(jié)合使用在<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>與嵌入式中的一些實(shí)用技巧

    經(jīng)典 C 語(yǔ)言編程,結(jié)構(gòu)聯(lián)合體如何共用?

    中可以 使用 sizeof 進(jìn)行獲取,默認(rèn)為字節(jié)對(duì)齊的大小。 聯(lián)合體 聯(lián)合體的參數(shù)共享同一個(gè)內(nèi)存地址,所占的內(nèi)存大小完全是由聯(lián)合體中參數(shù)類型決定字長(zhǎng),然后數(shù)據(jù)共享,內(nèi)存共享等。 結(jié)構(gòu)
    的頭像 發(fā)表于 01-11 18:24 ?1082次閱讀
    經(jīng)典 <b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b>編程,<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和<b class='flag-5'>聯(lián)合體</b>如何共用?