typedef
typedef 的作用是给存在的类型起一个新的名称。
使用场合有:
1>:基本数据类型
2>:指针
3>:机构体
4>:枚举
5>:执行函数的指针
例如: 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};
因为结构体有两种定义方式:
struct
{
int age ;
int no ;
} personal;
personal.age = 20;
personal.no = 2;
替换为:
tyoedef struct
{
int age ;
int no ;
} personal;
personal a = {20,2};
这种定义方式省略了 类型名称。也是可以的,但是此种情况下,只能用新起的这个名称personal 来定义新的结构体变量。不能在用 struct 类型名 变量名这种方式了。
指向函数的指针:
例如:
int sum ( int a ,int b)
{
return a+b;
}
int (*p) (int ,int );
p = sum;
// 定义了一个指向函数 sum 的指针 p .
可以这样:
typedef int (*mypoint ) (int ,int);
mypoint p = sum ;
typedef的语法规则其实很简单,一句话来说就是定义对象的语法前加关键字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。
现在前面有typedef,因此这个bintnode不是对象名而是类型名。也就是定义了一个类型别名bitnode,实际上指的就是struct node这个完整类型。
typedef定义的类型别名在作用域内和被定义的原类型语义上等价,都是表示同一个类型的名称。这里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空间内类型名和对象名没有重复,那么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类似,只是这里省略了结构体名称,是一个匿名类型。这样写的主要好处是类型名可以省略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 两者是不能互换的。