1 结构体的定义
允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(实际上应称为 结构体类型)。
2 struct的用法
下面以一个结构体实例来说明一下:
struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
};
名称 | 释义 |
---|---|
Sturct | 是声明结构体类型时所必须使用的关键字,不能省略。 |
os_tcb | 是结构体名 |
花括号内 | 是该结构体所包括的子项,称为结构体成员。 |
前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
可以采取以下3种方式定义结构体类型变量。
2.1 先声明结构体类型,再定义该类型的变量
定义上面的结构体类型后
struct os_tcb OS_TCB; // 在定义了结构体变量后,系统会为之分配内存单元
名称 | 释义 |
---|---|
struct os_tcb | 结构体类型名 |
OS_TCB | 结构体变量名 |
2.2 在声明类型的同时定义变量
struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
} OS_TCB; // OS_TCB 是一个结构体变量
2.3 不指定类型名而直接定义结构体类型变量
struct
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
} OS_TCB; // OS_TCB 是一个结构体变量
指定了一个无结构体名的结构体类型,显然不能再以此结构体类型去定义其他变量。
注:结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取后运算。在编译时,对类型不分配空间,只对变量分配空间。
3 typedef struct的用法
下面再以一个结构体实例来说明一下:
一般有两种用 typedef struct 定义结构体的方法
3.1 typedef struct 定义结构体的方法一
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB;
3.2 typedef struct 定义结构体的方法二
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
来定义结构体变量。
4 总结
有了以上叙述与理解,我们便可以很容易搞清楚一个易混淆的点:struct{}
后面的到底是结构体变量名,还是结构体类型名。
4.1 当只是定义结构体类型
struct 结构体名
{
结构体成员名
}结构体变量名;
引用结构体成员方式应是:
结构体变量名. 结构体成员名 // 结构体变量直接引用结构体成员
4.2 当使用typedef定义时
typedef struct 结构体名
{
结构体成员名
}结构体类型名;
引用结构体成员方式应是:
结构体类型名 xxx; // 定义一个结构体变量
xxx.结构体成员名 // 引用结构体成员
4.3 使用typedef定义作用
对于typedef struct 结构体名{}结构体类型名
,结构体类型名就相当于”struct 结构体名
“,只是使用typedef给其定义了一个别名。
我们都知道C中是不允许在定义结构体变量时省略struct关键字,当然C++中用不用的结果都是一样的,所以有时候为了平台的兼容性以及代码更好的可读性,我们使用typedef关键字,而且typedef的作用不止于此。
typedef只是给你的数据类型定义一个别名,不过使用typedef将能使你的代码更直观简洁,而且在代码跨平台移植时将提供极大的便利。
今天的文章结构体定义struct和typedef struct的区别(重新整理版)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31444.html