當前位置

首頁 > 商務英語 > 計算機英語 > c語言union的用法都有哪些

c語言union的用法都有哪些

推薦人: 來源: 閱讀: 2.85W 次

小編爲大家整理了c語言 union的用法。希望對你有幫助哦!

ing-bottom: 56.25%;">c語言union的用法都有哪些

  1. 爲了方便看懂代碼。

比如說想寫一個3 * 3的矩陣,可以這樣寫:

struct Matrix

{

union

{

struct

{

float _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33;

};

float f[3][3];

}_matrix;

};

struct Matrix m;

這兩個東西共同使用相同的空間,所以沒有空間浪費,在需要整體用矩陣的時候可以用

m._matrix.f (比如說傳參,或者是整體賦值等);需要用其中的幾個元素的時候可以用m._matrix._f11那樣可以避免用m.f[0][0](這樣不大直觀,而且容易出錯)。

  2. 用在強制類型轉換上(比強制類型轉換更加容易看懂)

下面舉幾個例子:

(1). 判斷系統用的是big endian 還是 little endian(其定義大家可以到網上查相關資料,此略)

#define TRUE 1

#define FALSE 0

#define BOOL int

BOOL isBigEndian()

{

int i = 1; /* i = 0x00000001*/

char c = *(char *)&i; /* 注意不能寫成 char c = (char)i; */

return (int )c != i;

}

如果是little endian字節序的話,那個i = 1;的內存從小到大依次放的是:0x01 0x00 0x00 0x00,如是,按照i的起始地址變成按照char *方式(1字節)存取,即得c = 0x01;

反之亦然

也許看起來不是很清晰,下面來看一下這個:

BOOL isBigEndian()

{

union

{

int i;

char c;

}test;

test.c = 2;

return test.i != 2;

}

這裏用的是union來控制這個共享佈局,有個知識點就是union裏面的成員c和i都是從低地址開始對齊的。同樣可以得到如此結果,而且不用轉換,清晰一些。

什麼,不覺得清晰??那再看下面的例子:

(2). 將little endian下的long long類型的值換成 big endian類型的值。已經知道系統提供了下面的api:long htonl(long lg);作用是把所有的字節序換成大端字節序。因此得出下面做法:

long long htonLL(long long lg)

{

union

{

struct

{

long low;

long high;

}val_1;

long long val_2;

}val_arg, val_ret;

if ( isBigEndian() )

return lg;

val__2 = lg;

val__ = htonl( val__ );

val__ = htonl( val__ );

return val__2;

}

只要把內存結構的草圖畫出來就比較容易明白了。

(3).爲了理解c++類的佈局,再看下面一個例子。有如下類:

class Test

{

public :

float getFVal(){ return f;}

private :

int i;

char c;

float f;

};

Test t;

不能在類Test中增加代碼,給對象中的f賦值7.0f.

class Test_Cpy

{

public :

float getVal(){ return f;}

float setVal(float f){ this ->f = f;}

private :

int i;

char c;

float f;

};

....

int main()

{

Test t;

union

{

Test t1,

Test_Cpy t2;

}test;

al(7.0f);

t = test.t1;

assert( al() == 7.0f );

return 0;

}