c語言struct C語言關鍵字union的使用

2021-10-11 07:03:53 字數 1424 閱讀 8930

在c語言中關鍵字union和struct用法是一樣的,而且在專案中struct隨處可見。在我的專欄"嵌入式入門——c語言入門到深入"中我詳細的講解了它們的異同。很多人編碼了多年也許會認為有struct就夠了,要union幹嘛,感覺union的存在有些雞肋,但是事實真的是這樣嗎?下面讓我來告訴你哪些應用場景union是不能被struct替代的,而且使用union也是唯一能夠很好的解決問題的。

我在專欄裡第十五章 c語言位操作裡介紹過位域這個知識點,裡面我也書寫了個非常經典的例程。經常和微控制晶元(mcu)打交道的嵌入式工程師對位操作一定不陌生,也經常接觸各類的中斷(中斷是指在程式執行的過程中,出現一些"異常"情況,需要mcu干預並轉入中斷處理情況,處理完後重新執行原程式的過程。計算機的執行就是靠中斷來維持的,鍵盤中斷,滑鼠中斷,螢幕顯示中斷,揚聲器中斷等等)。現在我使用聯合和位域相結合的辦法可以很好的表示它們。比如我定義如下聯合體:

當我們要去使用各個中斷的時候,直接使用uint8_t型別的資料很不直觀,但是使用裡面的位域卻可以很好的表達。此時只能使用聯合體而不能使用結構體。

現在讓我們來看看怎麼使用它。我先定義兩個開關中斷的巨集,定義如下:

使用如下:

從上圖可以看出,位域結合聯合使用是非常好表達的,在**裡能很直觀的表達我們自己的意圖。下面附上示例的完整**:

我當前使用的是deepin作業系統,程式執行結果顯示為"interrupts: 0xc0.",至於資料儲存模式大小端的知識我在專欄裡也介紹過,在此不再贅述。

順便說下,有人可能會認為在訊息佇列使用時,由於傳送的各個訊息各不相同,同一時刻只能傳送乙個訊息,因此可以使用聯合來節省空間,這麼一看貌似也對,的確可以如此。

但是你想過沒有,現在的計算機不差你那點儲存空間,可以大膽的去使用結構體也是可以的。如果我使用通用指標是不是是最佳的方案呢?定義如下:

通用指標怎麼用,有什麼妙用?我在專欄裡講解過該知識點後使用了比較多的示例去使用它,要多用多體會通用指標的妙用才好。

通過這一篇文章,希望你可以對聯合有了乙個更加深刻的認識,知道什麼場景才是最適合它的。

C語言 C語言關鍵字

目錄 含義 c語言中的關鍵字 關鍵字分類 資料型別關鍵字 型別修飾符關鍵字 複雜型別關鍵字 儲存級別關鍵字 流程控制關鍵字 跳轉結構 分支結構 迴圈結構 1.含義 被c語言賦予了特殊含義的單詞。特徵 都為小寫 在編譯器中會顯示特殊顏色 注 編譯器嚴格區分大小寫,不能用作變數名,函式名等。2.c語言中...

C語言 C語言關鍵字

目錄 含義 c語言中的關鍵字 關鍵字分類 資料型別關鍵字 型別修飾符關鍵字 複雜型別關鍵字 儲存級別關鍵字 流程控制關鍵字 跳轉結構 分支結構 迴圈結構 1.含義 被c語言賦予了特殊含義的單詞。特徵 都為小寫 在編譯器中會顯示特殊顏色 注 編譯器嚴格區分大小寫,不能用作變數名,函式名等。2.c語言中...

C語言關鍵字

c語言關鍵字 在檔案範圍的教訓和關鍵字,你知道靜態變數保持他們的價值觀,甚至不在他們超出範圍的破壞。比如說呢。int generateid int main this program prints 01 2 請注意,s nid一直保持它的價值的跨多個函式呼叫。static關鍵字有另一種意思當應用到全...