C語言結構體數組遇上typedef
昨天韓同學在做數據結構題的時候,問了我一個關於typedef 與結構體數組的問題:
1 typedef struct vexnode 2 { 3 int vertex; 4 arcnode* firstarc; 5 }adjlist[Vnum];
這裏我們先回顧一下struct是怎麽使用的。
1.有名構造類型-結構體
1 struct student //<-------結構名 2 { 3 char name[30]; //<-------結構成員 4 char sex; 5 int age; 6 float high; 7 }stu; //<--------定義數據類型同時定義stu結構體變量(不要忘記;號,在C語言中,凡是構造類型都要加分號,比如union) 8 struct student stu2; //<-------這時候我們還可以用struct student結構體類型定義另一個 stu2結構體成員變量(此處的struct不可省,在C++中才可以省略)
2.別名構造類型-結構體
上面我們使用有名構造類型-結構體可以滿足要求了,為何還要有個別名構造類型呢?
因為你看上面的第8行代碼,我們定義一個新的結構體類型變量時,每次都要寫上長長的前綴struct student 不太方便簡潔,而且在大型項目中,變量往往都占用了很長的位置,更顯累贅,於是typedef 登場了。
我們先看個例子:
1 typedef struct student 2 { 3 char name[30]; 4 char sex; 5 int age; 6 float high; 7 }STUDENT; 8 STUDENT stu, stu2;
對比上面兩例的代碼,我們發現是不是只有兩點差異:
1.struct 前添加了typedef ;
2.結構體的右下角右括號}後的結構體變量stu替換成了STUDENT;
於是,我們就可以用student結構體類型的別名STUDENT去定義結構體變量啦!就有了第8 行代碼,與我們的基本數據類型例如 int a ,是不是一致啦!
別忙,我們先理清下思路到底是怎麽給結構體類型取別名的?我想通過我上面的分析可以歸納出以下兩個步驟:
1.先按照有名構造類型-結構體 的方式定義結構體類型,同時定義一個結構體變量;
2.在定義好的結構體類型struct 前添加typedef,然後把定義的結構體變量替換成你取定的別名。
回到最初的問題,韓同學問我的typedef {...}adjlist[Vnum]; 這裏我們就可以這樣理解啦!
先struct {....}adjlist[Vnum] 了一個結構體類型並且同時聲明了一個adjlist[Vnum] 結構體變量,這個變量有點特殊,它是個數組,合起來就是結構體數組,既然名叫結構體數組,那麽這個數組中的每個元素的類型不就是 我們定義的結構體類型嗎?
再按照我們上面取別名的步驟,先typedef,然後把結構體變量換成你要取得別名,這裏比較特殊的是,我們取得結構體別名就是結構體數組,謹記,那麽adjlist 代表的就不僅僅代表一個結構體類型了,它被賦予了外加的一個特性:數組;也就是說如果我們這樣寫
1 adjlist a;
那麽上面的代碼中 a 就是一個結構體數組了,a中的每個元素都是我們定義的結構體類型。看到這你就差不多會用了,但是不是感覺還是有點未懂?
哎,其實我給你看下面的代碼:
1 typedef struct vexnode 2 { 3 int vertex; 4 arcnode* firstarc; 5 }[Vnum] adjlist;
你看,我把[Vnum]放在了前面 與前面的struct 一個整體 你是不是就明白了,其實原理也是這樣的,只是C編譯器不認識這種語法,我們把它放在後面了而已,但這種其實才符合人的思維。
小結:
1、我們定義的新類型,它的地位等同於int 類型。還只是個模子,如果沒有生成
2、變量的話,是不會占用空間的。
3、結構定義放置在程序的開始部分,位於頭文件聲明之後。
4、註意{}不表示復合語句,其後有分號。
5、結構體類型名稱是struct+結構體名,註意struct 關鍵字不能省略。
6、結構體數組的typedef 中我們可以把[] 前置 來幫助我們理解,但實際應用還是正常使用。
C語言結構體數組遇上typedef