當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > typedef分析理解
typedef是C語言中一個(gè)很好用的工具,大量存在于已有代碼中。
typedef 拆開 即為:type define,翻譯過來是類型定義,一般用于為類型起別名。
typedef定義的一般形式為: typedef 原類型名 新類型名 新類型名一般用大寫表示,以便于區(qū)別。
例1:typdefe int integer
Typedef為類型起別名總共分兩步:
第一步:聲明一個(gè)變量 int integer;
第二步:前邊加個(gè)typedef typedef int integer;
大家都知道第一步的語句聲明了一個(gè)變量integer,其類型是整型;如果在這個(gè)聲明的前面加上一個(gè)typedef后,整個(gè)語義又會(huì)是如何改變的呢?這以后integer是int類型的別名,所有用到int的地方都可以使用integer來替換。
如:integer a,b; 它等效于: int a,b; //a,b都是整型的變量
說白了,integer本來是一個(gè)變量的身份,前邊加個(gè)typedef后,搖身一變,變成了integer的類型的別名,具有了定義變量的權(quán)利。
typedef為類型起別名,別名一般用大寫,前邊小寫是為了易理解。
注意:這里要區(qū)分typedef 與define,有這樣一道常考的筆試題:
typedef char *CHAR與#define PCHAR char* 二者在功能上有什么不同?
程序執(zhí)行結(jié)果為:
分析:define為機(jī)械替換,CHAR a,b等價(jià)于char *a,b;即 char*a;char b;
此時(shí)a是char*類型,b是char類型
Typedef是為類型起別名,PCHAR c,d 等價(jià)于char *c;char *d;此時(shí)c和d都是char*類型。
例2:為結(jié)構(gòu)體取別名
以前的代碼中,聲明結(jié)果體新對(duì)象時(shí),必須帶上struct 結(jié)構(gòu)體名,如:
struct stu
{
char name[20];
int age;
char sex;
};
Struct stu s1,s2;//s1,s2皆為結(jié)構(gòu)體對(duì)象
使用typedef為結(jié)構(gòu)體取別名:
typedef struct stu
{
char name[20];
int age;
char sex;
} STU;
定義STU表示struct stu的結(jié)構(gòu)類型,然后可用STU來說明結(jié)構(gòu)變量: STU s1,s2; 這里的STU s1,s2等價(jià)于上邊的struct stu s1,s2; 代碼更加簡潔。
例3:typedef int AR[5]
AR a;
AR 和a分別代表什么?根據(jù)例1所述,去掉typedef ,AR是含有5個(gè)整型元素的數(shù)組,加上typedef后,AR是一個(gè)類型名,代表很有5個(gè)整型元素的數(shù)組類型,AR定義的a,那么a就是一個(gè)含有5個(gè)整型元素的數(shù)組。
程序運(yùn)行的結(jié)果為:
例4:是為函數(shù)指針起別名
typedef int (*PFUN)(int);
PFUN pf;
根據(jù)以上推理:
PFUN 是函數(shù)指針類型,該指針類型指向返回值類型為int,參數(shù)類型為int的函數(shù), 用PFUN這個(gè)類型去定義變量pf,此時(shí)的pf是函數(shù)指針變量,這個(gè)變量是指向返回值為int,形參類型為int的一類函數(shù)。
程序執(zhí)行結(jié)果: