嵌入式C中struct與union的區(qū)別 在本系列的上一篇文章中,我們討論了嵌入式C中的結(jié)構(gòu)允許我們對不同數(shù)據(jù)類型的變量進(jìn)行分組并將它們作為單個數(shù)據(jù)對象進(jìn)行處理。 除了結(jié)構(gòu)之外,C語言還支持另一個稱為聯(lián)合的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)可以將不同的數(shù)據(jù)類型組合為一個數(shù)據(jù)對象。本文將提供有關(guān)工會的一些基本信息。我們首先來看一個聲明并集的介紹性示例,然后研究該數(shù)據(jù)對象的重要應(yīng)用。 入門實(shí)例聲明一個聯(lián)合就像聲明一個結(jié)構(gòu)。我們只需要將關(guān)鍵字“ struct”替換為“ union”即可。考慮以下示例代碼: uniontest{ uint8_tc; uint32_ti; }; 這指定了一個模板,該模板具有兩個成員:“ c”(占用一個字節(jié))和“ i”(占用四個字節(jié))。 現(xiàn)在,我們可以創(chuàng)建該聯(lián)合模板的變量: uniontestu1; 使用成員運(yùn)算符(。),我們可以訪問“ u1”聯(lián)合的成員。例如,以下代碼將10分配給上述聯(lián)合的第二個成員,并將“ c”的值復(fù)制到“ m”變量(其類型必須為uint8_t)。 u1.i=10; m=u1.c; 將分配多少存儲空間來存儲“ u1”變量?盡管結(jié)構(gòu)的大小至少等于其成員的大小之和,但并集的大小等于其最大變量的大小。分配給工會的內(nèi)存空間將在所有工會成員之間共享。在上面的示例中,“ u1”的大小等于uint32_t的大小,即四個字節(jié)。此存儲空間在“ i”和“ c”之間共享。因此,為這兩個成員之一分配值將更改另一個成員的值。 您可能想知道,“使用相同的內(nèi)存空間來存儲多個變量有什么意義?此功能有什么應(yīng)用程序?” 我們將在下一部分中探討此問題。 我們需要共享的內(nèi)存空間嗎? 讓我們看一個示例,其中聯(lián)合可以是有用的數(shù)據(jù)對象。假定,如下圖1所示,系統(tǒng)中有兩個設(shè)備需要相互通信。 圖1 “設(shè)備A”應(yīng)將狀態(tài),速度和位置信息發(fā)送到“設(shè)備B”。狀態(tài)信息由三個變量組成,這些變量指示電池電量,操作模式和環(huán)境溫度。該位置由兩個變量表示,這些變量顯示了x軸和y軸的位置。最后,速度由單個變量表示。假定這些變量的大小如下表所示。 如果“設(shè)備B”需要不斷獲取所有這些信息,我們可以將所有這些變量存儲在結(jié)構(gòu)中,并將該結(jié)構(gòu)發(fā)送到“設(shè)備B”。結(jié)構(gòu)大小將至少等于這些變量的大小之和,即9個字節(jié)。 struct{ uint8_tpower; unit8_top_mode; uint8_ttemp; }status; struct{ uint16_tx_pos; unit16_ty_pos; }position; 現(xiàn)在,我們可以將這些結(jié)構(gòu)與“ vel”變量一起放在一個并集中: union{ struct{ uint8_tpower; unit8_top_mode; uint8_ttemp; }status; struct{ uint16_tx_pos; unit16_ty_pos; }position; uint16_tvel; }msg_union; 上面的代碼指定了聯(lián)合模板,并創(chuàng)建了該模板的變量(名為“ msg_union”)。在該聯(lián)合內(nèi)部,有兩個結(jié)構(gòu)(“狀態(tài)”和“位置”)和一個兩個字節(jié)的變量(“ vel”)。此聯(lián)合的大小將等于其最大成員的大小,即“位置”結(jié)構(gòu),該結(jié)構(gòu)占用四個字節(jié)的內(nèi)存。此存儲空間在“狀態(tài)”,“位置”和“ vel”變量之間共享。 struct{ uint8_tmsg_type; union{ struct{ uint8_tpower; unit8_top_mode; uint8_ttemp; }status; struct{ uint16_tx_pos; unit16_ty_pos; }position; uint16_tvel; }msg_union; }message; 我們可以為“ msg_type”變量考慮三個可能的值:“ s”表示“狀態(tài)”消息,“ p”表示“位置”消息,“ v”表示“速度”消息。現(xiàn)在,我們可以將“消息”結(jié)構(gòu)發(fā)送到“設(shè)備B”,并使用“ msg_type”變量的值作為消息類型的指示符。例如,如果接收到的“ msg_type”的值為“ p”,則“設(shè)備B”將知道共享內(nèi)存空間包含兩個2字節(jié)變量。 |
發(fā)布評論請先 登錄
相關(guān)推薦
評論