分三块来叙述:
1 首要://留意在C和C++里不同
在C中界说一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
所以在声明变量的时分就可:Stu stu1;(假如没有typedef就有必要用struct Student stu1;来声明)
这儿的Stu实际上便是struct Student的别号。Stu==struct Student
别的这儿也能够不写Student(所以也不能struct Student stu1;了,有必要是Stu stu1;)
typedef struct
{
int a;
}Stu;
但在c++里很简略,直接
struct Student
{
int a;
};
所以就界说了结构体类型Student,声明变量时直接Student stu2;
======================================================================================
2.其次:
在c++中假如用typedef的话,又会形成差异:
struct
{
int
}stu1;//stu1是一个变量
typedef
{
int
}stu2;//stu2是一个结构体类型=struct Student
运用时能够直接拜访stu1.a
可是stu2则有必要先
然后
======================================================================================
3 把握上面两条就能够了,不过最终咱们探讨个没多大联系的问题
假如在c程序中咱们写:
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;
这算什么呢?
我个人调查编译器(VC6)的了解,这相当于
typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;
也便是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都能够,在c++中也是如此。可是你要留意的是这个在c++中假如写掉了typedef关键字,那么aaa,bbb,ccc将是天壤之别的三个目标。
//此处不是很了解。
typedef struct和struct的差异:
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
上面的tagMyStruct是标识符,MyStruct是变量类型(相当于(int,char等))。
这句子实际上完结两个操作:
1) 界说一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
剖析:tagMyStruct称为“tag”,即“标签”,实际上是一个暂时姓名,不管是否有typedefstruct 关键字和tagMyStruct一同,构成了这个结构类型,这个结构都存在。
咱们能够用struct tagMyStruct varName来界说变量,但要留意,运用tagMyStruct varName来界说变量是不对的,由于struct 和tagMyStruct合在一同才干表明一个结构类型。
2) typedef为这个新的结构起了一个姓名,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因而,MyStruct实际上相当于struct tagMyStruct,咱们能够运用MyStruct varName来界说变量。
2.
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
在C中,这个申明后请求结构变量的办法有两种:
(1)struct tagMyStruct 变量名
(2)MyStruct 变量名
在c++中能够有
(1)struct tagMyStruct 变量名
(2)MyStruct 变量名
(3)tagMyStruct 变量名
typedef struct与struct的差异
1. 底子解说
typedef为C言语的关键字,作用是为一种数据类型界说一个新姓名。这儿的数据类型包括内部数据类型(int,char等)和自界说的数据类型(struct等)。
在编程中运用typedef意图一般有两个,一个是给变量一个易记且含义清晰的新姓名,另一个是简化一些比较复杂的类型声明。
至于typedef有什么奇妙之处,请你接着看下面临几个问题的详细论述。
2. typedef & 结构的问题
当用下面的代码界说一个结构时,编译器报了一个过错,为什么呢?难道C言语不答应在结构中包括指向它自己的指针吗?请你先猜测一下,然后看下文阐明:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
答案与剖析:
1、typedef的最简略运用
typedef long byte_4;
给已知数据类型long起个新姓名,叫byte_4。
2、 typedef与结构结合运用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这句子实际上完结两个操作:
1) 界说一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
剖析:tagMyStruct称为“tag”,即“标签”,实际上是一个暂时姓名,struct 关键字和tagMyStruct一同,构成了这个结构类型,不管是否有typedef,这个结构都存在。
咱们能够用struct tagMyStruct varName来界说变量,但要留意,运用tagMyStruct varName来界说变量是不对的,由于struct 和tagMyStruct合在一同才干表明一个结构类型。
2) typedef为这个新的结构起了一个姓名,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因而,MyStruct实际上相当于struct tagMyStruct,咱们能够运用MyStruct varName来界说变量。
答案与剖析
C言语当然答应在结构中包括指向它自己的指针,咱们能够在树立链表等数据结构的完结上看到很多这样的比如,上述代码的底子问题在于typedef的使用。
依据咱们上面的论述能够知道:新结构树立的过程中遇到了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)、标准做法:
typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );
这个曾经没有看到过,个人认为是宇界说一个uint32的指针函数,uint16*, uint32 为函数里的两个参数; 应该相当于#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );
struct在代码中常见两种方式:
struct A
{
//…
};
struct
{
//…
} A;
这其实是两个彻底不同的用法:
前者叫做“结构体类型界说”,意思是:界说{}中的结构为一个名称是“A”的结构体。
这种用法在typedef中一般是:
typedef struct tagA //成心给一个不同的姓名,作为结构体的实名
{
//…
} A; //结构体的别号。
后者是结构体变量界说,意思是:以{}中的结构,界说一个名称为”A”的变量。这儿的结构体称为匿名结构体,是无法被直接引证的。
也能够经过typedef为匿名结构体创立一个别号,然后使得它能够被引证:
typedef struct
{
//…
} A; //界说匿名结构体的别号为A