C语言提供了一个 类型定义 的功能 typedef 用此来建立新的数据类型名。
需要强调的是,从任何意义上来讲,typedef 的声明并没有创建一个新的类型,它只是为某个已经存在的类型增加一个新的名称而已。
typedef 声明也没有增加任何新的语义,通过这种方式声明的变量与通过普通方式声明的变量具有完全相同的属性。
typedef 类似与#define 语句,但是typedef是由编译器解释的,因此它的文本替换功能要超过预处理器的能力。
typedef 类型名 新的名称 ;(注意分号)
typedef的本质就相当于起“外号”,注意!这里替换的是类型,是类型。
那么面对比较复杂的类型定义时,如何准确判断他定义的何种类型呢?
typedef 类型名 新的名称 ;
怎么样现在是不是一目了然了?
Eg1. typrdef int Length;
将Length 定义为与int具有同等意义的名字。
在这里 int就相当于是“官名”,而length则就是你给他起了个“外号”。
然后我们可以用Length 来声明一些变量:
Length len,maxlen;等同于 int len,maxlen;
Eg2. typedef char *String;
我第一次看认为是将 char定义为“*String”,最后感觉不太对劲,查阅资料才知道
正确答案是:将String 定义为 字符指针(char *)
Eg3. typedef int (*MYFUN )(int , int);
这种用法一般用在给函数定义别名的时候
上例定义了MYFUN 是一个 函数指针,函数类型是带有两个int型参数,返回一个int 型
在分析这种形式的时候,可以用如下方法:
先去掉 typedef 和别名,剩下的就是原变量的类型。
去掉typedef 和MYFUN以后就剩: int (*)(int ,int)
Eg4. 不得不说typedef 和struct是一对好基友啊
typedef struct {
int a;
char array[100];
int b;
}MY_TYPE;
这里把一个未命名的结构直接取了一个叫 MY_TYPE 的别名,
如果你需要定义该结构体的实例: MY_TYPE tmp;
Eg5. 来段《The C Programming Language》中的代码
typedefstruct tnode *Treeptr;
typedefstruct tnode{ /*树节点*/
char *word; /*指向文本*/
int count; /*出现次数*/
Treeptr left; /*左子树*/
Treeptr right; /*右子树*/
}Treenode;
以上定义创建两个新型关键字:Treenode(一个结构体)和
Terrptr(一个指向该结构体的指针)
Treeptr talloc (void)
{
return (Treeptr) malloc(sizeof(Treenode));
}//尝试自己理解下这段代码