关于c:struct和typedef-struct区别

5次阅读

共计 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 构造体名

{

构造体成员名

} 构造体类型名;

正文完
 0