標籤:ora ati div ring char 使用 stat void 操作
typedef 的講解與應用執行個體
- 前言:我們學過C語言的人都應該聽過,或者說學過,甚至說用過typedef,多多少少都對其有所瞭解。不過就算沒聽過也沒關係,我們一起來探討一下。
- 闡述:typedef 是英文 Type Define 的縮寫,中文就是類型定義。在電腦程式設計語言中用來為複雜的聲明定義簡單的別名,它本身是一種儲存類的關鍵字,與auto、extern、mutable、static、register等關鍵字不能出現在同一個運算式中。
- typedef與define的差異:#define在先行編譯中,只是做簡單的完全替換不會做錯誤檢查,不管三七二十一,只會完全替換,例如:#define PI 3.1415926535 你寫成3.L415926535,傻傻的編譯器還是會把它代入引用的位置。而typedef unsigned int u16;
/*用法一:類型的重定義*/typedef unsigned char u8;typedef char * PCHAR;......
這裡的第一句是給unsigned char類型重新起個別名,叫 u8 應用時看到u8 定義的變數,就相當於unsigned char 類型,兩者是完全等價的。同理第二句是給char *
起了個別名PCHAR ,即 PCHAR 類型代表著指向字串類型的指標。
1 /*用法二:與結構體結合使用*/2 typedef struct tagMyStruct3 {4 int iNum;5 6 long lLength;7 8 }MyStruct;
這個代碼實際上相當於進行了兩個操作:
第一聲明了一個結構體名為 tagMyStruct
tagMyStruct稱為“tag”,即“標籤”,實際上是一個臨時名字,struct 關鍵字和 tagMyStruct一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。
我們可以用struct tagMyStruct varName來定義變數,但要注意,使用tagMyStruct varName來定義變數是不對的,因為struct 和tagMyStruct合在一起才能表示一
個結構類型。
1 struct tagMyStruct2 {3 4 int iNum;5 6 long lLength;7 8 };
第二給該結構體起了個別名叫 MyStruct
1 typedef struct tagMyStruct MyStruct;
因此,MyStruct實際上相當於struct tagMyStruct,我們可以使用MyStruct varName來定義變數。
當然,我們有時還會看到如下定義:
typedef struct student{ char name[N]; int age; char * sex;}std,*pt;
這時是不是感覺有點奇怪,究竟std是結構體的別名,還是*pt是結構體的別名呢?這就是我今天要講的重點。
上面的代碼相當於執行了三步操作:
第一步:定義結構體
struct student{ char name[N]; int age; char * sex;}std;
第二步:給結構體重新命名
typedef struct student std;
第三步:給結構體指標類型重新命名
typedef student struct * pt;
這時,我們可以用pt來聲明結構體指標類型的變數了,不用再寫 struct student * kk; 直接寫 pt kk; 簡單明了。
下面給個簡單的執行個體:
1 /* 2 * 程式名稱:typedef 的簡單一實例 3 * 4 * Veis聲明。 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #define N 20 9 typedef struct student10 {11 char name[N];12 int age;13 char * sex;14 }std,*pt; /*這裡的 pt 相當於一個 struct student * 類型;而 std 則是給結構體student起的別名*/15 void main()16 {17 /*變數聲明*/18 pt p; /*語句 struct student * p; 與語句 pt p; 等價*/ 19 std st1;20 21 /*變數初始化*/22 strcpy(st1.name,"alen");23 st1.age = 15;24 st1.sex = "male";25 p = &st1;26 27 /*列印輸出*/28 printf("\t\t\tStudent‘s Informations\nname:%s\nage:%d\nsex:%s\n\n",p->name,p->age,p->sex);29 }
PS:心動不如行動,看完自己嘗試去寫,只有去寫去思考,你才能更好的理解和掌握一種東西。
本文作者能力有限,若本文有什麼講錯的地方歡迎指出,共同進步。-----------------Veis
C語言中的typedef