C語言指標(三) union C語言的棄兒

2021-10-01 10:06:00 字數 1767 閱讀 8397

union作為c語言的乙個關鍵字跟關鍵字volatile一樣很少出現在程式設計師 的視野之中,當然相比於volatile,union的處境相對還好一點。但是我總覺得他是c語言的棄兒。

那麼union與指標有什麼關係呢?答案是有,我們都知道union的成員變數是共享同一塊記憶體的,所以我們在使用union時會特別注意union在記憶體中的形態。與記憶體有關就與指標有關。

有的讀者可能從開始學c語言就不覺的union有什麼用,甚至有的讀者學習和使用很長時間的c語言都從來沒有使用過union。當然,幾乎所以的應用在不使用union的情況下都可以實現。但是有時候使用它會有意想不到的效果。下面我主要列舉union兩方面的應用:

1.做嵌入式軟體開發的讀者都知道,我們幾乎所有的通訊方式傳輸的都是位元組流,但是我們要傳輸的實際資料卻各種各樣,有float、double、int甚至是結構體。我們在傳輸之前往往需要將這些資料型別轉換成位元組流。以串列埠通訊為例,假設微控制器採集溫度感測器的溫度值為float型的資料,微控制器採集到資料後需要把資料通過串列埠傳送給上位機。這是我們遇到的問題是怎麼把float的資料準確無誤的轉換為unsigned char型的資料,而上位機接收到資料後又怎樣把unsigned char型的資料轉換為float?

這時union就登上了歷史的舞台,你可能有其他的轉換方法但union無疑是最方便的。我們都知道float在記憶體中佔4個位元組,而unsigned char型的資料在記憶體中佔1個位元組。另外資料在記憶體中實際的儲存形態都是二進位制的01形態。而我們眼中的的float和unsigned char在記憶體眼裡毫無區別。於是我們就用乙個union作為乙個轉換器,輸入float輸出四個unsigned char,輸入四個unsigned char輸出乙個float。廢話少說**如下:

union converter

;

下面我們來試試是不是可以轉化:

#include

union converter

;int

main()

//上位機接收到了資料

printf

("var2:%f\n"

, var2.float)

;return0;

}

上面的程式模擬了一次微控制器向上位機傳輸一次資料,上位機接收資料的過程,執行結果如下圖:

我們發現轉化的過程完全就是簡單的賦值過程,無需任何的多餘操作。是不是發現了這個c語言棄兒的神奇之處了?

2.做微控制器開發我們無法拒絕使用者裝置掉電後我們機器的執行引數不能丟失的要求。可是flash一般儲存的都是unsinged int型資料,而我們裝置的引數又是各種各樣,有int,float,字串甚至是結構體。幾十個引數各不相同轉化起來費時費力,怎麼解決呢?

有了前面的例子你是不是已經想到啦?沒錯就是用神奇的union。

為了方便管理,我們先定義乙個結構體,將所有我們需要儲存的引數集合到一起。

struct storage

;

然後我們計算一下這個結構體的大小, 4+20+4 = 28個位元組。unsigned int資料佔4個位元組,所有我們的union定義如下:

union converter

;int

main()

執行結果與第乙個例子一樣。我們發現我按照我前面兩篇博文建立的記憶體模型,我們很好理解這種轉化的內部原理。

沒錯我就是那個化腐朽為神奇的blucejie

c語言指標(三)

5 陣列和指標的關係 陣列的陣列名其實可以看作乙個指標。看下例 例九 intarray 10 value value array 0 也可寫成 value array value array 3 也可寫成 value array 3 value array 4 也可寫成 value array 4 ...

C語言指標學習三

因為指標和位址操作有關,先從位址匯流排說起。上節提到計算機cpu操作記憶體中的資料具體操作控制哪個記憶體單元是由位址匯流排控制。目前,大多數電腦cpu和記憶體條之間一般有32根位址匯流排 32跟位址匯流排就控制了2的32次方個記憶體單元。每個記憶體單元又是8個位元位,實際上32根位址匯流排控制的記憶...

C語言筆記(三)函式 指標

函式,相當於把大的任務拆分成小的模組,一般乙個函式不超過80行 每個程式只有乙個主函式 輸出資料只能是乙個。有多個返回值的時候可以使用乙個引數 函式宣告 只寫函式頭,不寫函式體 在函式宣告時,可以省略引數列表的引數名,只寫引數型別 傳值方式,在函式呼叫時,把實參值的乙份拷貝,賦值給形參 可以寫乙個例...