共计 2635 个字符,预计需要花费 7 分钟才能阅读完成。
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 构造体名
{
构造体成员名
} 构造体类型名;