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