第 23 講:typedef 關(guān)鍵字
前文我們講完了所有三種自定義類型,也說明了它們的基本使用方式和模式,今天我們來看點(diǎn)不一樣的。我們把這三種類型通過定義類型關(guān)鍵字 typedef
來改變它們的定義寫法,甚至也可以用它把前文學(xué)到的所有類型都改個(gè)名字。
定義基本類型
我們可以使用 typedef
關(guān)鍵字,把一個(gè)基本類型換一個(gè)名字。這樣的話,所有程序代碼里將都可以使用這個(gè)替換的名稱(當(dāng)然也可以用原名)。
通過 typedef int Int32
這樣的定義后,后面就可以使用 Int32
來替換 int
的定義方式了。
這種用法實(shí)際上也出現(xiàn)在很多場(chǎng)合,例如在 C 語言的文件里,經(jīng)常將一個(gè)無符號(hào)的整數(shù) unsigned int
定義為長度類型 size_t
,這種定義方式導(dǎo)致了我們一眼就看得出這是表示長度的參數(shù),我們就不會(huì)傳入一個(gè)負(fù)數(shù)數(shù)值,也不會(huì)傳入一個(gè)小數(shù)。
定義指針變量類型
我們也可以拿這個(gè)定義關(guān)鍵字把指針類型改變類型名稱。
這樣的定義方式可以使得把 int *
改為 IntPtr
,后續(xù)就可以直接用這種定義符號(hào)來為指針類型作出定義了。不過需要注意的是,定義為指針類型后,后面的使用和沒有定義的方式完全是一樣的,只有定義語句的類型名稱這里可以看到不同的地方。
定義數(shù)組變量類型
我們可以使用 typedef
為數(shù)組定義新的名稱。寫法和數(shù)組變量的聲明差不多,只是這一次把數(shù)組變量改為了數(shù)組類型,寫在對(duì)應(yīng)位置上。
定義好后,數(shù)組類型就可以直接用了,把 IntArr
這種定義好的類型放在類型名稱的位置上,類似于 int i
這樣的定義默認(rèn),先類型后名稱。然后后面的使用就和數(shù)組使用方式完全一樣。
不過需要你注意的是,數(shù)組變量類型需要你為其賦準(zhǔn)確的數(shù)組大小的數(shù)值。和前文一樣,你不能定義 VLA 類型在這個(gè) typedef
語句上。
定義數(shù)組指針類型
我們可以將復(fù)雜的類型改為很簡單的類型,這也是 typedef
的一大功能。
試想一下,數(shù)組指針的寫法是這樣的:
這表示一個(gè)指向長度為 20 的一維數(shù)組的指針。這種寫法很多時(shí)候都是很不好看和不好理解的,所以我們嘗試將其定義為簡單類型:
ptr
變量來指向 arr
*ptr
來獲取指向的數(shù)組信息,然后再在后面添加索引器 []
寫法完全類似于前文的方式,我們定義一個(gè)函數(shù)指針,然后讓變量 ptr
直接指向函數(shù)即可。
函數(shù)傳參也可以用哦!
而且,這樣的使用可以到任意位置,包括前面的數(shù)組指針、數(shù)組變量、指針變量,也都可以用到函數(shù)傳參的地方上來。例如:
typedef
定義后就可以直接這么書寫了。當(dāng)然,數(shù)組長度是可以不規(guī)定的,但 typedef
需要有這一個(gè)定義,所以我們不得不書寫這個(gè)數(shù)字(當(dāng)然,這個(gè)數(shù)字在這里顯然是沒啥用處的)。
結(jié)構(gòu)體、聯(lián)合體和枚舉類型
經(jīng)過這樣的定義方式后,Week
、Student
和 Tag
三個(gè)單詞就可以作為 enum week
、struct student
和 union tag
的替換類型名稱了。你就不用再去書寫前面的這個(gè)關(guān)鍵字 enum
、struct
和 union
了。
不過,這三個(gè)定義是把類型名稱放后面的。
其它復(fù)雜類型的定義
還有一些復(fù)雜的類型,例如函數(shù)指針的數(shù)組,這些類型我們可以采用兩次定義的方式來簡化:
FuncPtr
這樣也是可以的。