C語言中的typedef
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 tagMyStruct 3 { 4 int iNum; 5 6 long lLength; 78 }MyStruct;
這個代碼實際上相當於進行了兩個操作:
第一聲明了一個結構體名為 tagMyStruct
tagMyStruct稱為“tag”,即“標簽”,實際上是一個臨時名字,struct 關鍵字和 tagMyStruct一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。
我們可以用struct tagMyStruct varName來定義變量,但要註意,使用tagMyStruct varName來定義變量是不對的,因為struct 和tagMyStruct合在一起才能表示一
個結構類型。1 struct tagMyStruct 2 { 3 4 intiNum; 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 student 10 { 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