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