三,基本資料型別(下)

白夜行zz發表於2014-12-04

今天我們來看資料型別的第二個分支,構造型別:

構造型別包括四個部分,陣列,結構,共用體和列舉:

陣列應該是我們最熟悉的了,它使用起來也很方便,定義和使用都很好理解。比如我們需要存一個buffer,或者存光電管的127個ad值,存在陣列裡面都很方便。除了要習慣習慣下標從0開始之外應該沒什麼問題。

其實剩下的三個也很有用,尤其是在我現在這個專案裡面,結構和列舉就用的比較普遍。

先說結構,結構的定義是這樣的:

struct stu{
  int num;
  char name[20];
  char sex;
 float score;
} ;

容易看出這樣我們就看出了我們定義了一個名叫 stu 的結構來表示學生。裡面有很多成員變數,有學號,姓名,性別,成績等等,這些成員變數可以是不同的型別。需要說明的是,結構體是一種結構,同int char float 一樣,結構的賦值是這樣的,給成員變數賦值通過 結構體.成員變數的方式來實現:接著上面的程式碼:

stu boy1,girl1,boy2;
boy1.name = zz;
girl1.name = liz;
girl.sex = ‘g’;
boy2 = boy1;

既可以為結構的成員變數賦值,也可以為結構整體賦值。

再來看列舉,列舉也是很常用的一個構造型別,列舉型別定義的一般形式為: enum 列舉名{ 列舉值表 }; 在列舉值表中應羅列出所有可用值。這些值也稱為列舉元素。

例如,該列舉名為orientation,列舉值共有4個,即東南西北。凡被說明為orientation型別變數的取值只能是四個中的某一個。我們來看程式碼:

enum orientation{east,south,west,north}
enum orientation a,b;
a = east;
b = south;

定義列舉成員的時候,即大括號裡的部分,每一個列舉量是由0遞增一次排序的,即east = 0,south = 1, west = 2, north = 3. 這是由系統分配好的。同時,定義為列舉變數的,比如例子中的a,b 其賦值只能為括號裡面的四個的一個。只有 a = e/s/w/n 或者 a = 0/1/2/3 ; 是合法的,但是不建議使用數字來命名,這樣違反了使用列舉的本來用意。可以看出,使用列舉搭配switch 語句是很方便的。

最後來說說聯合體,共同體的使用我見的還是比較少的,起碼目前這個專案裡還沒用到。聯合體中的所有成員是共享一段記憶體的,因此每個成員的存放首地址相對於於聯合體變數的基地址的偏移量為0,即所有成員的首地址都是一樣的。為了使得所有成員能夠共享一段記憶體,因此該空間必須足夠容納這些成員中最寬的成員。對於這句“對齊方式要適合其中所有的成員”是指其必須符合所有成員的自身對齊方式。

下面舉例說明:

如聯合體

union U
{
    char s[9];
    int n;
    double d;
};

s佔9位元組,n佔4位元組,d佔8位元組,因此其至少需9位元組的空間。然而其實際大小並不是9,用運算子sizeof測試其大小為16.這是因為這裡存在位元組對齊的問題,9既不能被4整除,也不能被8整除。因此補充位元組到16,這樣就符合所有成員的自身對齊了。從這裡可以看出聯合體所佔的空間不僅取決於最寬成員,還跟所有成員有關係,即其大小必須滿足兩個條件:1)大小足夠容納最寬的成員;2)大小能被其包含的所有基本資料型別的大小所整除。

所以目前我們寫的程式碼控制元件都比較夠用,基本上需要使用共同體的情況就不是很多啦。但是當需要限制多個資料每次只能取其一的時候,使用共同體還是比較方便的,雖然這種需求好像也不多。

所以,構造型別主要就這幾種了~我是想說啊~像結構和列舉這種東西,我們初學的時候是不喜歡用的,一是因為麻煩,二是如果功能簡單,不用好像也沒啥關係。但是,咳咳,這是不對滴~確實,比如年齡啊性別啊,不定義再學生的結構裡又能怎樣,如果只有簡單的操作好像還更簡單呢。

但是啊,我們不能老從方便的角度想問題,好多時候維護程式碼的可讀性是很重要的,使用結構和列舉能夠大大加強程式碼的可讀性。同時也能夠減少出錯的機率。比如用列舉,如果不用的話呢,其實也沒啥關係,只不過你自己就要記住那些 case 1, case 2, case 3, ,, ,,,到底是什麼了,就算你自己記住了,讓看你程式碼的人怎麼辦~我們的目的不是寫出機器可執行的程式碼,而是寫出別人容易懂得程式碼~艾瑪好像一不小心說出來了一個很有哲理的句子,等會兒我先加個黑。。。

所以這些可能一時我們不是很習慣使用,但是第一,看到別人的程式碼裡用到了的時候也別不懂,萬一哪天自己想到用了就會有一種 臥槽用這個逼格好高的趕腳。於是我們就學會用了。。。。。。 其實還有一種非常非常重要的指標還沒說,以後再說吧~

相關文章