分类: C/C++
2009-06-05 17:47:49
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
typedef与结构结合使用:
定义struct结构体:struct 结构体名{
包含的成员;
... } 变量名;
//这里的结构体名如果后面不用的话,可以省略;如果暂时不急定义变量来使用的话,那么这里的变量名也可以省略;其他的一个都不能少。
※注意:结构体定义是不可以递归的
例如:struct time{
int hour;
int min;
int sec;
struct time next;
};//非法的定义,编译报错。
但是我们可以这么解决:struct time{
int hour,min,sec;
struct time *next;
};//合法的
定义结构体变量可以在刚才的结构体定义的后面定义,但是它毕竟是有局限的。一般是用:
struct 结构体名 变量名(指针名,数组名...);//初始化
例如:struct time bjtm;//bjtm代表北京时间
指针也可以定义为结构的类型,说白了就是指向这种结构的指针,所以有:struct time *tm;
那么我们怎么使用这个指针呢?
先赋值:tm=&bjtm; 至此,tm可以使用这个bjtm了,并且可以修改它了。
注意在调用成员的时候格式为两种:
1:tm->min;//最常用的
2:(*tm).min;//很少用了
typedef定义的一般形式为:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode; //编译错误,因为:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决方法:
1)、typedef struct tagNode {
char *pItem;
struct tagNode *pNext; } *pNode;
2)、typedef struct tagNode *pNode;
struct tagNode{
char *pItem;
pNode pNext; }; //此处用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法
3)、规范做法:struct tagNode{
char *pItem;
struct tagNode *pNext;};
typedef struct tagNode *pNode;
typedef 原类型名 新类型名; //功能:将原类型名表示的数据类型用新类型名代表
例如:typedef int counter; //int a; 与 counter a;二者定义的效果一样
例如:typedef char stringb[12]; // string text; 表明text为含12个字符的数组 再例如:typedef char *stringptr; // stringptr buffer; 表明buffer为字符指针
另外:typedef struct stu
{ char name[20];
int age;
char sex;
} STU;
定义STU表示stu的结构类型,然后可用STU(新类型名)来说明结构变量:
STU body1,body2; //定义了body1,body2 两个结构体变量,也相当于struct stu body1,body2;
EXAMPLE: 举例举例1:struct: struct stu
{ int num;
char name[20];
char sex;
int age;
}s1={97001,"Lin Lin",'F',19};//在定义的时候就初始化s1;
举例2:typedef struct :typedef struct
{ int num;
char name[20];
char sex;
int age;}stu;
int main{
stu s1;//注意这里的写法
s1.age=18;
....}
举例3:用typedef,当遭遇定义结构体指针的时候
typedef struct stu//(1)
{ int num;
char name[20];
char sex;
int age;
stu *p;//这个有的书上会写成struct stu *p 都一样。
}stu;//(2)
int main{
stu s1,s2;//注意这里的写法
s1.p=&s2;
s1.age=18;
....
}
注意:此结构体中涉及到定义结构体指针stu *p; 这里必须在上面typedef struct stu给出别名,也就是(1)出的stu
(1),(2)两处的别名可以不一致,也就是struck的名字不必和typedef的名字相同。
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这语句实际上完成两个操作:1) 定义一个新的结构类型struct tagMyStruct 2)为新类型起了一个新名字Mystruct