typedef 的作用是給存在的類型起一個新的名稱掏愁。
使用場合有:
1>:基本數(shù)據(jù)類型
2>:指針
3>:機構體
4>:枚舉
5>:執(zhí)行函數(shù)的指針
例如:? typedef? int? myint;
//? 給int 起了一個新的名稱 myint ;
? ? myint a = 20;
上面這兩行就等價于: int? a = 20;
例如:? char? * name = "itcast ";
? typedef char * string ;
string name = " itcast ";
上面這兩句也是等價的扁瓢。
例如:
struct? person?
{
? int? age ;
? int no ;
};
struct person a = {20,2};
就相當于:? typedef? struct person? p;
? p a = {20,2};
也可以這樣寫:
typedef? struct? person?
{
? int? age ;
? int no ;
}? p;
p a = {20,2};
因為結(jié)構體有兩種定義方式:
struct? ?
{
? int? age ;
? int no ;
}? personal;
personal.age = 20;
personal.no = 2;
替換為:
tyoedef? struct?
{
? int? age ;
? int no ;
}? personal;
personal a = {20,2};?
這種定義方式省略了 類型名稱。也是可以的蹲坷,但是此種情況下,只能用新起的這個名稱personal 來定義新的結(jié)構體變量士飒。不能在用? struct 類型名? 變量名這種方式了眼姐。
指向函數(shù)的指針:
例如:
int? sum (? int a ,int b)
{ ?
return? a+b;
}
int? (*p)? (int ,int );
p = sum;
//? 定義了一個指向函數(shù) sum 的指針 p .
可以這樣:
typedef? int (*mypoint )? (int ,int);
mypoint? p = sum ;
typedef的語法規(guī)則其實很簡單剃允,一句話來說就是定義對象的語法前加關鍵字typedef球化,剩下的不變,原本定義的對象標識符換成類型標識符呕缭,對應語義從定義一個對象改成定義一個類型別名堵泽。typedef看起來復雜根本原因是對象定義的語法比較復雜,例如分隔符*和[]的用法臊旭。
typedef struct node{
datatype data;
struct node *lchild,*rchild;
} bintnode;
對應的對象定義:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;
去除bintnode來看就是一個類型struct node的完整描述落恼。加上了bintnode來看箩退,表示定義了一個struct node類型的對象bintnode离熏。
現(xiàn)在前面有typedef,因此這個bintnode不是對象名而是類型名戴涝。也就是定義了一個類型別名bitnode滋戳,實際上指的就是struct node這個完整類型。
typedef定義的類型別名在作用域內(nèi)和被定義的原類型語義上等價啥刻,都是表示同一個類型的名稱奸鸯。這里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空間內(nèi)類型名和對象名沒有重復可帽,那么struct可以省略娄涩,struct node等價于node)。
更復雜一點的:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode, *bintree;
注意定義對象時*修飾對象本身而不是修飾類型。因此這里定義了struct node對象bintnode和struct node*類型的對象bintree蓄拣。
對應的類型定義:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode, *bintree;
這里定義了類型別名bintnode表示完整類型struct node扬虚,以及bintree表示類型struct node*。
拆開來就成了
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;
typedef bintnode *bintree;
這種寫法看起來應該稍微清楚了一點球恤。
至于下面的cirqueue辜昵,和上面的bintnode類似,只是這里省略了結(jié)構體名稱咽斧,是一個匿名類型堪置。這樣寫的主要好處是類型名可以省略struct
枚舉:
? enum? season
{
? speing,
? summer,
? autumn?,
winter
} ;
enum season a = spring ;
可以替換為:
? typedef? enum? season
{
? speing,
? summer,
? autumn?,
winter
}? myseason;
myseason a = spring ;
typedef? 使用注意:
某些時候可以和 # define 互換,因為宏定義實際是文本替換张惹。而 typedef 是類型替換
例如:
# defined myint? int;
myint a = 10;
與 typedef? int? myint ;
? myint? a = 10;
這幾句代碼是等價的 舀锨,都相當于: int a = 10;
但是有時候則不行,例如:
1:typedef? char * str;
str p1, p2;
p1= "jack";
p2 = "rose";
2: #define str2? char * str;
str2 p3, p4;
//? 相當于? char *? p3,p4;
//? 分別為: char * p3;
//? ? char p4;
宏定義只是文本替換 不是類型替換诵叁,所以只有p3是指針類型的雁竞。
此時# define? 和 typedef 兩者是不能互換的。