C語言“綽號(hào)”之typedef的理解
C語言允許為一個(gè)數(shù)據(jù)類型起一個(gè)新的別名,就像給人起“綽號(hào)”一樣。
起別名的目的不是為了提高程序運(yùn)行效率,而是為了編碼方便。例如有一個(gè)結(jié)構(gòu)體的名字是
stu,要想定義一個(gè)結(jié)構(gòu)體變量就得這樣寫:
struct?stu?stu1;
struct 看起來就是多余的,但不寫又會(huì)報(bào)錯(cuò)。如果為 struct stu 起了一個(gè)別名 STU,書寫起來就簡單了:
STU?stu1;
這種寫法更加簡練,意義也非常明確,不管是在標(biāo)準(zhǔn)頭文件中還是以后的編程實(shí)踐中,都會(huì)大量使用這種別名。
使用關(guān)鍵字?typedef?可以為類型起一個(gè)新的別名,語法格式為:
typedef??oldName??newName;
oldName 是類型原來的名字,newName 是類型新的名字。例如:
typedef?int?INTEGER; INTEGER?a,?b; a?=?1; b?=?2;
INTEGER
a,b;等于int a,b;。
typedef
還可以給數(shù)組、指針、結(jié)構(gòu)體等類型定義別名。先來看一個(gè)給數(shù)組類型定義別名的例子:
typedef?char?ARRAY20?[20]?;
表示 ARRAY20 是類型char
[20]
的別名。它是一個(gè)長度為 20 的數(shù)組類型。接著可以用 ARRAY20 定義數(shù)組:
ARRAY20?a1,?a2,?s1,?s2;
它等價(jià)于:
char?a1[20],?a2[20],?s1[20],?s2[20];
又如,為結(jié)構(gòu)體類型定義別名:
typedef?struct?stu{ ????char?name[20]; ????int?age; ????char?sex; }?STU;
STU 是 struct stu 的別名,可以用 STU 定義結(jié)構(gòu)體變量:
STU?body1,body2;
它等價(jià)于:
struct?stu?body1,?body2;
再如,為指針類型定義別名:
typedef?int?(*PTR_TO_ARR)[4];
表示?PTR_TO_ARR?是類型int?*?[4]的別名,它是一個(gè)二維數(shù)組指針類型。接著可以使用?PTR_TO_ARR?定義二維數(shù)組指針:
PTR_TO_ARR?p1,?p2;
按照類似的寫法,還可以為函數(shù)指針類型定義別名:
typedef?int?(*PTR_TO_FUNC)(int,?int); PTR_TO_FUNC?pfunc;
為指針定義別名。
#includetypedef?char?(*PTR_TO_ARR)[30]; typedef?int?(*PTR_TO_FUNC)(int,?int); int?max(int?a,?int?b){ ????return?a>b???a?:?b; } char?str[3][30]?=?{ ????"http://write.blog.csdn.net/postedit", ????"C", ????"C-Language" }; int?main(){ ????PTR_TO_ARR?parr?=?str; ????PTR_TO_FUNC?pfunc?=?max; ????int?i; ??? ????printf("max:?%dn",?(*pfunc)(10,?20)); ????for(i=0;?i<3;?i++){ ????????printf("str[%d]:?%sn",?i,?*(parr+i)); ????} ????return?0; }
需要強(qiáng)調(diào)的是,typedef 是賦予現(xiàn)有類型一個(gè)新的名字,而不是創(chuàng)建新的類型。為了“見名知意”,請(qǐng)盡量使用含義明確的標(biāo)識(shí)符,并且盡量大寫。