1. 程式人生 > >C語言結構體數組遇上typedef

C語言結構體數組遇上typedef

位置 聲明 adjlist tex list 表示 寫上 大型 結構體類型

昨天韓同學在做數據結構題的時候,問了我一個關於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