天天看點

C語言之共用體

1:共用體(union)類型的定義

<code>union</code> <code>myunion</code>

<code>{</code>

<code>int</code> <code>a;</code>

<code>char</code> <code>b;</code>

<code>};</code>

<code>int</code> <code>main(</code><code>void</code><code>)</code>

<code>myunion u1;</code>

<code>u1.a = 23;</code>

<code>printf</code><code>(</code><code>"u1.b = %d\n"</code><code>, u1.b);     </code><code>//23</code>

<code>printf</code><code>(</code><code>"&amp;u1.a = %p \n"</code><code>,&amp;(u1.a));  </code><code>//&amp;u1.a = 0xbfbe5c04</code>

<code>printf</code><code>(</code><code>"&amp;u1.b = %p \n"</code><code>,&amp;(u1.b));  </code><code>//&amp;u1.b = 0xbfbe5c04</code>

<code>}</code>

總體上來講共用體和結構體的定義方法很類似,使用方法也基本一樣

2:共用體和結構體的差別

  (1)結構體類似于一個包裹,結構體中的成員彼此是獨立存在的,分布在記憶體的不同單元中,他們隻是被打包成一個整體叫做結構體而已;共用體中的各個成員其實是一體的,彼此不獨立,他們使用同一個記憶體單元。可以了解為:有時候是這個元素,有時候是那個元素。更準确的說法是同一個記憶體空間有多種解釋方式。也就是說共用體是同一個記憶體空間,裡面存放的數值(二進制)是一樣的,使用u1.a去通路這個記憶體時是按int類型去解析這個記憶體空間,使用u1.b去通路這個記憶體時是按char類型去解析這個記憶體空間。總的來說共用體就是同一塊存放着二進制數的記憶體空間的不同了解方式。

  (2)使用sizeof去測量共用體的大小時,測得的是union中各個元素裡面占用記憶體最大的那個元素的大小。因為這樣才能夠存放下所有的元素。

  (3)union中的元素不存在記憶體對齊的問題,因為union中實際隻有1個類型的記憶體空間,都是從同一個位址開始的(開始位址就是整個union占有的記憶體空間的首位址),是以不涉及記憶體對齊。

3:共用體的主要用途

  (1)共用體就用在那種對同一個記憶體單元進行多種不同規則解析的這種情況下。

  (2)C語言中其實是可以沒有共用體的,用指針和強制類型轉換可以替代共用體完成同樣的功能,但是共用體的方式更簡單、更便捷、更好了解。

本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1862803

繼續閱讀