目录
1.4.2 typedef为这个新的结构起了一个名字,叫MyStruct
1. 什么是 typedef ?
1.1 typedef为C语言的关键字
C 语言提供了 typedef 关键字,可以使用它来为类型取一个新的名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等);
1.2 在编程中使用typedef目的
一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
1.3 typedef最简单的应用——为已知数据类型命名
typedef unsigned char my_byte;
上面的含义是给已知数据类型unsigned char起个新名字,叫my_byte。typedef相当于给unsigned char起了一个别名。
my_byte b1, b2;
1.3.1 typedef vs #define
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
1.4 typedef与结构结合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
MyStruct xiaoming;
这语句实际上完成两个操作:
1.4.1 定义一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
}
分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
1.4.2 typedef为这个新的结构起了一个名字,叫MyStruct
typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
MyStruct = struct tagMyStruct
若struct tagMyStruct{}这样来定义结构体的话。在申请tagMyStruct的变量时,需要这样写,struct tagMyStruct n; 若用typedef,可以这样写,typedef struct tagMyStruct{}TagMyStruct; 。在申请变量时就可以这样写,TagMyStruct n; 区别就在于使用时,是否可以省去struct这个关键字。
1.4.3 C语言不允许在结构中包含指向它自己的指针吗?
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
首先C语言允许在结构中包含指向它自己的指针,但typedef struct tagNode {} *pNode;结构体声明通过上述介绍实际上进行了两步;第一步是建立结构体类型struct tagNode {},但实际上建立的过程中就遇到了pNext域的声明,其类型是pNode,因为pNode表示的是新类型的名字,由于在类型本身还没有建立完成之前这个类型的新名字实际上并不存在,故编译器无法识别pNode。
解决上述问题的方法如下:
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在这个例子中,用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。
2. struct在代码中常见两种形式
struct在代码中常见的两种形式如下,这是两个完全不同的用法,即:
2.1 结构体类型定义
意思是:定义{}中的结构为一个名称是“A”的结构体。
struct A
{
//...
};
这种用法在typedef中一般是:
typedef struct tagA //故意给一个不同的名字,tagA作为结构体的实名
{
//...
} A; //结构体的别名。
2.2 结构体变量定义
struct
{
//...
} A;
以{}中的结构,定义一个名称为"A"的变量。这里的结构体称为匿名结构体,是无法被直接引用的。
也可以通过typedef为匿名结构体创建一个别名,从而使得它可以被引用:
typedef struct
{
//...
}
3. struct在C++的定义
在c++中如果用typedef的话:
struct Student
{
int a;
}stu1;//stu1是一个变量
stu1是一个变量,使用时可以直接访问stu1.a 。
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型
stu2是一个结构体类型,使用时则必须先 stu2 s2。