struct和typedef struct 结构体定义区别

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.com/blog/static/203259238201245105525341/)

阅读程序发现两种用 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 结构体名

{

        结构体成员名

 

}结构体类型名;

引用结构体成员方式应是:

结构体类型名 xxx;// 定义一个结构体变量

xxx.结构体成员名  // 引用结构体成员
--------------------- 
作者:SudekiMing 
来源:CSDN 
原文:https://blog.csdn.net/WalterBrien/article/details/79624405 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值