结构体的嵌套 自身嵌套 相互嵌套

什么是结构体的嵌套?

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

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

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

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

结构体应该注意的问题?

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

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

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

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

不用TYPEDEF——错误的方式:

  1. #include<iostream>
  2. using namespace std;
  3. struct tag_1{
  4. struct tag_1 A; //A是一个结构体,A的内部还会有一个结构体,以此下>去,无线循环。在内存分配的时候,由于无限的嵌套,无法确定结构体的长度,所>以时非法的。
  5. int value;
  6. };
  7. int main()
  8. {
  9. return 0;
  10. }

不用TYPEDEF——正确的方式:

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

用TYPEDEF——错误的方式:

  1. #include<iostream>
  2. using namespace std;
  3. typedef struct{
  4. int value;
  5. NODE *link;
  6. }NODE;
  7. //使用typedef为结构体创建一个别名NODE。
  8. //但是是错误的,因为类型名的作用域是从语句结尾开始的,而在结构体内部是不>能使用的,因为还没有定义。

*********************************相互引用结构体******************************

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

用TYPEDEF——错误的方式:

#include<iostream>using namespace std;typedef struct tag_a{B *bp;int value;}A;typedef struct tag_b{A *ap;int value;}B;//错误的,在类型B在定义之前就被引用

用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. };

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

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

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

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

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

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

  1. /* 错误的表示*/
  2. typedef struct //这里是结构体类型的定义
  3. {
  4. int value;
  5. s_ref_1 *link;//注意这局引用了结构体类型名
  6. }s_ref_1;//ISO C 不允许声明无类型的's_ref_1’
  7. /* 正确的表示*/
  8. typedef struct s_ref_t //这里是结构体类型定义 和 结构体标签
  9. {
  10. int value;
  11. struct s_ref_t *link;//注意这句话与上面相同位置的区别,使用了标签
  12. }s_ref_2;
(0)

相关推荐