什么是结构体的嵌套?

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

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

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

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

结构体应该注意的问题?

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

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

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

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

不用TYPEDEF——错误的方式:

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

不用TYPEDEF——正确的方式:

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

用TYPEDEF——错误的方式:

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

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

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

用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——正确的方式(“不完全声明”):

#include<iostream>
using namespace std;
//正确的方式 使用不 完全声明
typedef struct tag_a A;
typedef struct tag_b B;
struct tag_a
{
//      struct tag_b *bp;B *bp;int value;
};
struct tag_b
{
//      struct tag_a *ap;A *ap;int value;
};

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

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

typedef struct tag_1
{int value;struct tag_1 *link;
}NODE;
typedef struct tag_1 NODE;
struct tag_1
{int value;NODE *link;
};
struct tag_1
{int value;struct tag_1 *link;
};
typedef struct tag_1 NODE;

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

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

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

/* 错误的表示*/
typedef struct  //这里是结构体类型的定义
{int value;s_ref_1 *link;//注意这局引用了结构体类型名
}s_ref_1;//ISO C++ 不允许声明无类型的‘s_ref_1’/* 正确的表示*/
typedef struct s_ref_t //这里是结构体类型定义 和 结构体标签
{int value;struct s_ref_t *link;//注意这句话与上面相同位置的区别,使用了标签
}s_ref_2;

结构体的嵌套 自身嵌套 相互嵌套相关推荐

  1. 【DaVinci Developer专题】-24-IDT高阶应用:结构体中元素(数组,结构体,联合体)类型相互嵌套

    共15页 目录 1 创建一个Value IDT 2 创建一个Array IDT 3 创建一个Record IDT 4 创建一个Union IDT 5 创建一个Record IDT <

  2. C语言之结构体嵌套调用(十八)

    1.结构体一 struct GstCollectData{GstCollectPads *collect;GstPad *pad;GstBuffer *buffer; }2.结构体二 struct G ...

  3. 托管代码C#调用非托管C++ API, 封送嵌套结构体数组

    一.前言: 最近这两天由于项目需要,提供给客户的C++ 动态库需要返回自定义结构体数组,网上也查了很多资料, 推荐一本书, <精通.NET互操作:P/Invoke.C++ Interop和COM ...

  4. c/c++结构体如何判断相等而且是否能相互赋值

    直接讲结论: 结构体之间, 是支持直接用等号=赋值的 但是不支持直接用==判断是否相等的,编译会报错.我们可以通过一个char指针指向两者的首地址,然后顺序判断每一个字节是否相同即可.但是逐个字节进行 ...

  5. 结构体类型、联合体类型

    结构体和联合体 一.结构体类型 1. 结构体类型的设计和初始化 2. 结构体大小的计算 3. 结构体成员的访问和赋值 4. 结构体类型和指针 (1)变量名为指针时: (2)结构体赋值时容易出现的问题: ...

  6. c语言 结构体 ppt,第8章C语言的结构体和共同体.ppt

    <第8章C语言的结构体和共同体.ppt>由会员分享,可在线阅读,更多相关<第8章C语言的结构体和共同体.ppt(41页珍藏版)>请在皮匠网上搜索. 1.1第八章结构体.共用体和 ...

  7. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  8. c/c++ 结构体赋初值的小技巧

    1.CC++结构体的初始化 今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式. 对结构体 struct A { int b; int c; } 有几种初始化方式: ...

  9. 获取另一个驱动的设备结构体_Linux 驱动开发 / 设备模型快速入门

    背 景 Read the fucking source code!  --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版 ...

  10. 深度剖析C语言结构体

    深度剖析C语言结构体 1.什么是结构 2.结构体的声明 3.结构体变量的定义 4.结构成员变量的访问: 5.结构体变量的初始化: 6.嵌套的结构体: 7.结构体数组: 8.typedef 9.结构的自 ...

最新文章

  1. 图的遍历——DFS(邻接矩阵)
  2. 在一台机器上搭建多个redis实例
  3. Apache Spark技术实战之6 -- spark-submit常见问题及其解决
  4. JDK动态代理实现原理--转载
  5. Oracle EM 12c
  6. java string做除法_如果用java来实现传统方式的除法,用String来保存结果,想精确多少位都行,那改怎么做?...
  7. python golang 小工具_使用Go语言简单模拟Python的生成器
  8. AspNetPager使用方法
  9. 解读 2018之Go语言篇(上):为什么Go语言越来越热?
  10. python极客项目编程 豆瓣_《Python极客项目编程》
  11. php配置了扩展为什么不生效,php安装扩展模块后,重启不生效的原因及解决办法...
  12. 使用u盘安装linux操作系统原理
  13. Nvivo用法--数据可视化工具
  14. 迅捷PDF编辑器怎么编辑修改PDF文件?
  15. 你为什么成为一名程序员?
  16. C++关键字分析系列
  17. uni-app中使用HTML5 Plus
  18. 【日语口语词典学习】第0004页
  19. 【兔年烟花】旖旎风景——浪漫烟花(Python实现)
  20. 图片损坏打不开如何修复?

热门文章

  1. rest-framework 视图
  2. python中的多继承
  3. python连接mysql中报错1064修改方法
  4. Java设计模式探讨之单例模式
  5. 优化SQl的30中常用方法
  6. Sublime Text开发Quick-Cocos2d-x环境搭建(Mac)
  7. srm 593 dv2 1000pt
  8. Programming Pearls Essay 01
  9. 利用OpenCV的库函数Sobel和Scharr作图像的边缘检测
  10. java吵醒线程_一文搞懂 Java 线程中断