今天被學弟問了一個問題
struct 和 union 的差異性
其實這個我只會用
但要我解釋就不太熟了
所以還是把他搞懂
struct 就是把不同的成員儲存在一起。
union 其實就是把所有的成員指向同一個位址,而這個位址內的所佔的空間大小以成員最大空間來決定。
以前常會把union 和struct 合在一起用
union sample{
unsigned int data;
struct
{
unsigned D0:1;
unsigned D1:1;
unsigned D2:1;
unsigned D3:1;
unsigned D4:1;
unsigned D5:1;
unsigned D6:1;
unsigned D7:1;
unsigned D8:1;
unsigned D9:1;
unsigned D10:1;
unsigned D11:1;
unsigned D12:1;
unsigned D13:1;
unsigned D14:1;
unsigned D15:1;
};
}ans;
如果我需要改整個變數的話,那麼就是ans.data=0x1155;
那麼裡面的資料會自動改成
ans.D0=1
ans.D1=0
ans.D2=1
ans.D3=0
ans.D4=1
ans.D5=0
ans.D6=1
ans.D7=0
ans.D8=1
ans.D9=0
ans.D10=0
ans.D11=0
ans.D12=1
ans.D13=0
ans.D14=0
ans.D15=0
其實還滿方便的。
今天發現了一個更方便的用法,將一個型態為LONG的變數宣告成很多種可能的用法。
union LNG
{
long l;
unsigned long ul;
int i[2];
unsigned int ui[2];
char b[4];
unsigned char ub[4];
};
union LNG
test;
執行程式
test. ui[0]=0x5555;
test.ui[1]=0x3333;
那麼其他的成員就會自動變成
test.l=0x33335555
test.ul=0x33335555
test.i[0]=0x5555
test.i[0]=0x3333
test.b[0]=0x55
test.b[1]=0x55
test.b[2]=0x33
test.b[3]=0x33
test.ub[0]=0x55
test.ub[1]=0x55
test.ub[2]=0x33
test.ub[3]=0x33
這樣其實還滿方便好用的
要選擇long 、unsigned long 、integer 、 unsigned integer、byte 和unsigned byte 都很好用
如果變數只要當旗標的話,其實只需要1個bit,如果選擇char 或是int 來用的話,那麼都會很浪費,這時候就可以用結構來當作旗標來結省記憶體,
struct
{
unsigned D0:1;
unsigned D1:1;
unsigned D2:1;
unsigned D3:1;
unsigned D4:1;
unsigned D5:1;
unsigned D6:1;
unsigned D7:1;
unsigned D8:1;
unsigned D9:1;
unsigned D10:1;
unsigned D11:1;
unsigned D12:1;
unsigned D13:1;
unsigned D14:1;
unsigned D15:1;
}y;
用法就用
y.D0
y.D1
…
…
滿好用的2個function
有一個好用的地方就是你想把浮點數的4個Byte用UART傳出去時...用union就很方便了。
回覆刪除[版主回覆02/02/2010 23:23:43]嗯,如果在UART的時候,用binary傳送其實有時候也很方便。除了可以減少byte數也可以省去編ASCII Code 和解ASCII Code的問題。
沒想到又看到這個問題。我的部落格補上了我的舊文章。
回覆刪除浮點數通信傳輸
原來超連結有問題。現在知道要如何做了,以下這個才是對了。
回覆刪除浮點數通信傳輸