-
用法一:可以減少代碼的書寫量
struct student{
int data;
char name[10];
};
當我們定義學生結構體的時候要這么定義struct student s1,s2,s3; 如果想定義結構體指針,我們可以這么定義,struct student *ps1, ps2; 顯然ps2不是指針類型,但是好多初學者對指針不熟悉,所以容易出錯,但是當我們用typedef的時候,就不會出現這樣的錯誤了,
typedef struct student{
int data;
char name[10];
}stu, *pstu;
我們定義的時候可以這么定義stu s1, s2, s3; 定義結構體指針的時候,可以這么定義,pstu ps1, ps2; 這樣ps1, ps2都是指針類型的變量 這是typedef的用法之一,也是比較常用的。
-
用法二:可以實現代碼的復用性和可擴展性
如果一段代碼沒有擴展性和復用性,那么這段代碼就不能算得上是一段特別規范的代碼,就像我們為了實現代碼的復用性,提高程序可讀性的時候,用函數一樣,提高代碼的復用性和可擴展性是作為軟件開發者必備的本領。一段好的代碼,如果在別的項目中引用的話,如果功能類似,基本上改不了幾行,這就是規范性的重要性(這里先不談規范性,但是這個typedef的用法也涉及規范性,嘿嘿,所以規范是避免不了的)。就這么來說吧,假如我們定義了一個結構體
struct student{
int score;
char name[10];
};我們想把成績改成double類型的,應為int的精度太低了,但是下面用到的地方可能都要改掉,但是,我們要是用typedef一下, 問題就變得簡單多了,
typedef int typeitem;
struct student{
typeitem score;
char name[10];
};這樣直接改typedef就行了,其他的代碼根本不用動,這就是分層的原因,我們只改變最底層的,上層的東西根本不用變(就像在鏈表中,我們可以把它分為三層,純數據層、節點層、head指針層,也就是整條鏈)這樣分層處理問題會變得簡單得多。還有就是平臺不同可以兼容,就像有的平臺不支持long double類型,但是你如果定義了long double 直接不能用,但是如果這么 typedef long double typeitem; 直接改成可以支持的類型就行啦,根本不用那么麻煩改下面的代碼,這也是比較重要的用途。
-
用途三:簡化,提高可讀性
想必大家覺得,這個用途不是包含在上面的用途之中了嗎,為什么還要再說一遍呢,其實我舉個例子你也就明白了,typedef int array[10],這個代表什么意思,這可不是平時那種array[10】是個int了吧,這個代表,array是個重定義的類型,array a; 就代表a是一個含有10個int型元素的數組,這么定義可能覺得簡化不了多少,還不如直接int a[10];看著明白呢,好! 繼續往下看,typedef array Array[5]; 這個呢,如果我這么定義一個變量 Array arr[2]; 這個又是什么意思呢?這個就是定義個Array類型數組,其中這個“一維”數組有兩個元素,但是每個元素又都是Array 類型的,每個Array又是一個5行10列二維數組,所以arr就是一個三維數組,他就等于int arr[2][5][10]; 是不是看的有點蒙了, 其實在C語言中根本不存在多維數組,全部都是一維數組,只是一維數組里面又含一維數組,所以才構成了所謂的“多維”數組, 如果這樣理解的話,是不是覺得多維數組也就不那么“神奇”了,變得簡單了,沒有那么暈了,這樣定義的好處就是可以講一個多維的數組轉化成我們比較熟悉的一維數組,這樣操作起來就比較容易了,可讀性自然也會增強。所以這就是他的“簡化”的作用。其實我們還可以在函數指針上體現,想定義個函數指針int (p)(); 我們可以定義為typedef int (POWER)(); 接下來可以直接定義POWER p1, p2; 他就等價于int (p1)(), int (p2)(); 這樣也非常易懂。