结构体嵌套的正确表示

什么是结构体的嵌套?

在结构体的定义中,结构体的成员又是另外一个结构体的变量。

结构体嵌套的问题有哪些?

结构体的自引用,就是在结构体内部,包含指向自身类型结构体的指针。

结构体的相互引用,就是说在多个结构体中,都包含指向其他结构体的指针。

结构体应该注意的问题?

结构体定义中可以嵌套其他结构体类型的变量,不可以嵌套自己这个类型的变量。

可以嵌套自己类型的指针。

*********************************自引用结构体******************************

****************************************************************************

不用TYPEDEF——正确的方式:    

 1 #include<iostream>
 2 using namespace std;
 3 struct tag_1
 4 {
 5 struct tsg_1 *A;
 6 //由于指针的长度时确定的(在32位机器上指针长度是4),所以编译器能够确定该
 7 结构体的长度
 8 //这个指针看似指向自身,其实不是,而是执行同一类型的不同结构。
 9 int value;
10 };

 

用TYPEDEF——正确的方式(“不完全声明”):

 1 #include<iostream>
 2 using namespace std;
 3 //正确的方式 使用不 完全声明
 4 typedef struct tag_a A;
 5 typedef struct tag_b B;
 6 struct tag_a
 7 {
 8 // struct tag_b *bp;
 9 B *bp;
10 int value;
11 };
12 struct tag_b
13 {
14 // struct tag_a *ap;
15 A *ap;
16 int value;
17 };

********************************结构体嵌套的三种正确形式************************

***********************************************************************************

1 typedef struct tag_1
2 {
3 int value;
4 struct tag_1 *link;
5 }NODE;
1 typedef struct tag_1 NODE;
2 struct tag_1
3 {
4 int value;
5 NODE *link;
6 };
1 struct tag_1
2 {
3 int value;
4 struct tag_1 *link;
5 };
6 typedef struct tag_1 NODE;

结构体自身嵌套时候要注意:

    结构体内部定义了一个指向结构体的指针,指针的大小在具体的机器平台和编译器环境中都是已知的(不同的平台环境的定义不完全相同)。但是要提醒的是:这个指针看似指向自身,其实不是,而是指向同一类型的不同结构。

链表和树的数据结构就都使用到此技巧。自身的结构体指针指向下一节点或者下一子树的地址。

1 /* 正确的表示*/
2 typedef struct s_ref_t //这里是结构体类型定义 和 结构体标签
3 {
4 int value;
5 struct s_ref_t *link;//注意这句话与上面相同位置的区别,使用了标签
6 
7 }s_ref_2;
posted @ 2020-03-18 20:21  洪豆豆的记录  阅读(1299)  评论(0编辑  收藏  举报