1.构造体的定义:
容许用户本人建设由不同类型数据组成的组合型的数据结构,它称为构造体(实际上应称为 构造体类型)。
2.上面以一个构造体实例来阐明一下struct的用法:
struct os_tcb{ OS_STK *OSTCBStkPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId; };
Sturct 是申明构造体类型时所必须应用的关键字,不能省略。
os_tcb 是构造体名花括号内 是该构造体所包含的子项,称为构造体成员。后面只是建设了一个构造体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不调配存储单元。为了能在程序中应用构造体类型的数据,该当定义构造体类型的变量,并在其中寄存具体的数据。
能够采取以下3中形式定义构造体类型变量。
(1)先申明构造体类型,再定义该类型的变量定义下面的构造体类型后struct os_tcb OS_TCB; // 在定义了构造体变量后,零碎会为之分配内存单元(2)在申明类型的同时定义变量struct os_tcb{ OS_STK *OSTCBStkPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId; } OS_TCB; // OS_TCB 是一个构造体变量(3)不指定类型名而间接定义构造体类型变量struct { OS_STK *OSTCBStkPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId; } OS_TCB; // OS_TCB 是一个构造体变量
指定了一个无构造体名的构造体类型,显然不能再以此构造体类型去定义其余变量。
注:构造体类型与构造体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取后运算。在编译时,对类型不调配空间,只对变量调配空间。
3.上面再以此构造体实例来阐明一下typedef struct的用法:
(次要参考技术博客:http://dzdesigned80.blog.163....)
阅读程序发现两种用 typedef struct 定义构造体的办法
第一种:typedef struct os_tcb{ OS_STK *OSTCBStkPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId; }OS_TCB;第二种:typedef struct { OS_STK *OSTCBStkPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId; }OS_TCB;
能够看出,下面的区别在于 typedef struct 前面一个跟了标识符,另外一个没有跟标识符,这两个有什么区别呢?这里的os_tcb代表什么?OS_TCB的意义又是什么?
要搞清楚下面的问题,要从两方面动手。
第一 typedef的用法是什么?
typedef是在根本类型的根底上定义类型的同义字。留神typedef并不产生新的类型。例如 typedef int exam_score;这里的exam_score 就是一种根本类型,它的意义等同于 int,那么即能够用它来定义整型变量,例如:exam_score LIMING。
第二 构造体的定义各个标志符的意义。
在构造体定义中,通常是这样的
struct exam_score
{
chinese;
english;
math;
physical;
chemistry;
}LIMING;
这里的struct是构造体关键字,exam_score则是构造体类型名,LIMING则是构造体变量。
弄明确以上两个问题,回过头来看开始的那两个构造体。
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB; // OS_TCB是一个构造体类型 = struct os_tcb**
这里申明一种构造体类型os_tcb,所以os_tcb就是构造体类型名;OS_TCB是struct os_tcb 的同义字,所以能够间接用OS_TCB来定义变量,同时也能够这样 struct os_tcb xxx,OS_TCB xxx;都是非法的,因为OS_TCB 就等同于 struct os_tcb。
来看第二种
typedef struct
{
*OS_STK OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB; // OS_TCB是一个构造体类型 = struct
在构造体的定义中容许这样模式的定义:
struct
{
xxx
xxx
xxx
}var;
这里没有申明构造体变量名,间接定义了构造体变量var,var在这里是构造体变量。这样定义的后果是在程序不能再定义新的构造体变量。
这种模式加上typedef 之后状况就变了,这里的OS_TCB不是构造体变量,而是struct的同义字(构造体类型),这个同义仅限于下面定义的那种状况,能够用OS_TCB来定义构造体变量。
总结:
有了以上叙述与了解,咱们便能够很容易搞清楚一个易混同的点:struct{}前面的到底是构造体变量名,还是构造体类型名。
当只是定义构造体类型:
struct 构造体名
{
构造体成员名
}构造体变量名;
援用构造体成员形式应是:
构造体变量名. 构造体成员名 //构造体变量间接援用构造体成员
当应用typedef定义时:
typedef struct 构造体名
{
构造体成员名
}构造体类型名;