目錄
聯合體
聯合體的定義
聯合體的長度
如果來判斷設備的字節序?
如何把大端數據轉換成小端數據?
枚舉
枚舉的定義
上一篇復習了結構體,這一節復習聯合體和枚舉。
說明:我們學過單片機的一般都是有C語言基礎的了,網上關于C語言的資料有很多,大家如果對C語言不熟悉的話可以先去詳細學一下,再以這篇博文作為復習資料學習。
這篇博文的目的是復習C語言,我們會陸續以30多個編程題作為復習要點,這30多個編程題基本涵蓋了C語言所有的內容了,只要你掌握了這30多個編程題,那么你的C語言基本就沒什么問題了。
注意:由于本專欄是嵌入式全棧開發專欄,為了我們能熟悉以后實際工作中的開發環境,我們寫C語言全部在Linux中的vim編輯器中寫,這么做事為了我們能夠熟練掌握Linux系統的常用命令以及Linux上的vim編輯器的常用工作命令,以達到對口訓練的目的!
vim編輯器的一些工作命令在上一篇博文中已經詳細介紹過了,如果不了解可以先去看看。
我們正式開始:
聯合體
為什么要學習聯合體?
結構體有個缺點就是比較占內存,因為我們每次使用結構體時要給里面的每個成員都開辟空間,但是有時候我們只需要用到里面的某個成員,而不是全部,我們只想為我們使用到的成員申請空間,但是其他成員又不能直接刪掉,因為我們有時候還會使用到其他成員,所以怎么辦呢?這個時候聯合體就派上了用場。
聯合體又叫共用體。是一種特殊的數據類型,允許在相同的內存位置存儲不同的數據類型。聯合體可以帶有多個成員,但是任何時候只能有一個成員帶有值。聯合體提供了一種使用相同的內存位置的有效方式。
聯合體的定義
定義聯合體需要用到union關鍵字。union 語句定義了一個新的數據類型,帶有多個成員。
union 語句的格式如下:
union 共用體名
{ ?????????
????????成員表列
};
聯合體的長度
例如:
union test
{
????????int a;
????????int b;
????????char c;
};
它的總長度是4
聯合體的特點:
- 聯合體的所有成員共享同一塊內存空間;
- 聯合體大小:只為最長成員分配空間;
如果我們給a初始化為100,test.a=100;
由于內存是同一個空間,我們訪問a,即是訪問b,因此當我們打印b的時候,結果也是100,如果訪問char c情況就有可能不一樣,因為我們不知道c是在4個字節的哪一端,取決于電腦的字節序。
筆試的時候經常用聯合體來判斷設備的字節序。(這個我們在復習一維數組的時候就已經提到過了)
小端字節序:低字節存放在低地址,高字節存放在高地址。
大端字節序:高字節存放在低地址,低字節存放在高地址。
注意:數組無疑是:數組元素的地址是從低地址到高地址,比如a[0]存放在低地址,a[4]存放在高地址。
如果來判斷設備的字節序?
示例:
假設聯合體:
union test
{
????????char ch[2];
????????short val;
};
我們讓val=0x0102;這個是16進制,里面有兩個字節,分別為0000 0001(高字節)和0000 0010(低字節),我們由于ch和val共享一個空間,那么我們只要判斷0000 0001是放在了ch[0](低地址)還是放在了ch[1](高地址)就能知道設備是小端字節序還是大端字節序了。
參考代碼:
#include <stdio.h>union test
{char ch[2];//兩個字節short val;//short是兩個字節
};int main()
{//定義聯合體變量union test t;t.val=0x0102;if(t.ch[0]==1&&t.ch[1]==2){printf("big\n");}else if(t.ch[0]==2&&t.ch[1]==1){printf("small\n");}return 0;
}
運行結果:
該設備為小端字節序,一般來說電腦或者我們使用的開發板一般都是小端字節序。
如何把大端數據轉換成小端數據?
我們只需要將高字節和低字節調換位置即可
示例:
假設int num=1; 0000 0000 0000 0000 0000 0000 0000 0001,這個1屬于低字節,現在要求將它挪到高字節。
提示:將低字節取出來通過位移運算移動到高字節。
參考代碼:
#include <stdio.h>int main()
{int num=1;printf("%d\n", ((num & 0x000000ff)<<24)|(num &0x0000ff00<<8)|(num &0x00ff0000>>8)|(num &0xff000000>>16));return 0;}
運行結果:
用計算器計算的結果也是16777216
枚舉
枚舉的關鍵字:enum
枚舉和宏定義有點類似。但是有些情況宏定義顯得有點繁瑣,比如給每個星期的英文縮寫重新定義一個數字, 那么我們需要寫:
#define MON 1
#define TUE 2
#define WED 3
......
一個星期7天,那我們重復宏定義7次,這樣就顯得有點繁瑣了,因此我們需要用到枚舉。
枚舉的定義
enum weekday?//這個weekday在這里可以不用也寫
{
????????sun,mon,tue,wed,thu,fri,sat
};
雖然枚舉中我們并沒有給sun,mon,tue,wed,thu,fri,sat定義0,1,2,3,....但是編譯器會默認sun是0,mon是1,tue是2....這樣就可以申請繁瑣的定義操作。
當然如果你不想要枚舉默認,那么你也可以自己指定,比如
enum
{
????????sun,mon=11,tue,wed,thu,fri,sat
};
當我們這樣講mon定義成11時,那么后面的tue也就跟著變成12了,依次遞增。
以上就是這篇內容,如想了解更多,歡迎訂閱本專欄!
如有問題可評論區或者私信留言,如果想要進交流群請私信!