在学习链表的时候用到了结构的自引用,这里学习一下:

《C和指针》对结构的自引用的分析还比较清晰!这里做笔记记录下:

在一个结构内部包含一个类型为该结构体本身的成员是否合法呢?下面给出一个例子,仅供判断:

struct SELE_REF1 {int a;struct SELF_REF1 b;int c;
}

这种类型的自引用是非法的,因为成员b是另一个完整的结构,其内部还将包含它自己的成员b。这样重复下去永无止境。这有点像永不会终止的递归程序。

但下面的这个声明是合法的:

struct SELF_REF2{int a;struct SEF_REF2 *b;int c;
}

那为什么这个声明就是合法的呢?

这个声明和上面那个声明的区别就是b现在是一个指针而不是结构。编译器在结构的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。


警惕这个陷阱:

typedef struct {int a;SELF_REF3 *b;int c;} SELF_REF3;

这个声明的目的是为这个结构创建一个类型名SELF_REF3。但是它失败了,原因是类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义,怎么就可以使用了呢?

解决方案是定义一个结构标签来声明b,如下:

typedef struct TAG{int a;struct TAG *b;int c;} SELF_REF3;

这样才是没有问题的!

【 C 】结构的自引用相关推荐

  1. keil 结构体引用_结构体 自引用

    转载网址:http://tscsh.blog.163.com/blog/static/20032010320138249183520/ 今天关于结构体一些疑问,在这里标记一下 1.定义与声明 结构体的 ...

  2. 自引用结构兼谈Malloc和Free函数

    原文地址http://www.cnblogs.com/P_awl/archive/2010/04/08/1707852.html 一.自引用结构 1. 什么事自引用结构? 自引用结构(Self-Ref ...

  3. c语言常量结构体的成员,c语言之结构体

    c语言之结构体 1.结构体基础知识 C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构.数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构 ...

  4. 【C语言笔记初级篇】第七章:结构体相关

    目录 (1)结构体的声明,定义,初始化和成员访问 A:什么是结构体 B:结构体声明和定义 C:结构体的初始化 D:成员访问 (2)结构体传参 (3)结构体自引用 (4)内存对齐 (5)结构体传参 (6 ...

  5. c语言 结构体的,c语言之结构体

    c语言之结构体 1.结构体基础知识 C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构.数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构 ...

  6. 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合

    目录 一.结构体 1.特殊的声明 2.结构体自引用 3.结构体变量的定义和初始化 4.打印结构体 二.==结构体内存对齐== 1.内存对齐 结构体嵌套如何求 为什么存在内存对齐? 2.修改默认对齐数 ...

  7. 关于结构体,枚举,联合的一些知识

    关于结构体,枚举,联合的一些知识 首先我们来看一下什么是结构体 通俗来说,结构体便是各种类型的集合. 接下来便是各处所代表的含义了 例如,我们现在来描述一个人. 其中name,age,sex,addr ...

  8. 结构体 struct 的深入理解

    一.结构体 1.结构体的声明: struct tag { member-list; }variable-list; 解析:tag是结构体的标签, struct tag是结构体的类型, member-l ...

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

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

最新文章

  1. java socket 线程池_java socket编程的一个例子(线程池)
  2. mvc上传图片(上传和预览)webuploader
  3. Spring Cloud Feign 启动报错 java.lang.ClassNotFoundException: org.springframework.cloud.client.loadbalan
  4. JSON 之 SuperObject(3): 访问
  5. NumPy库---介绍
  6. zip知识点的部分总结!
  7. JavaScript数据结构与算法基础学习笔记03----链表与双向链表
  8. 缓存中间件技术选型Memcached、MongoDB、Redis
  9. 高通芯片(Android)恢复\编辑\备份 imei(nv信息)工具及步骤
  10. 语音合成1700多个中文音频
  11. 汉语言文学专业需要学计算机吗,读个汉语言文学专业,学了有什么鬼用?
  12. 来看看你踩坑没有,新手做自媒体却没有收益?原因都在这5点
  13. Panoramic Photography
  14. 小米机器人 尘盒配件_小米机器人怎么取出尘盒
  15. android ar 动画,Android实现支付宝AR扫描动画效果
  16. 实例讲解FusionInsight MRS RTD 实时决策引擎在医保行业应用
  17. Python3网络爬虫之requests动态爬虫:拉钩网
  18. MT6737/MT6737T/MT6737M处理器功能介绍,MT6737芯片资料
  19. bootstrap实战--微金所项目(轮播图1)
  20. 2天线8状态空时网格码 c语言实现

热门文章

  1. arduino串口监视器显示nan_使用Arduino开发板制作摩尔斯电码生成器
  2. delphi 数据 上移 下移_脑图-数据库查询优化器的艺术
  3. linq where 数组_C#中LINQ与数据管道
  4. python中的排序方法都有哪些_几种常见的排序方法总结(Python)
  5. 公共端接正极还是负极_【动力电池大事记】现代摩比斯启动首批模组工厂,松下拟挪威建厂,200名车主起诉现代,密歇根大学开发锂金属固态电池及“无负极”工艺...
  6. 全国大学生智能车竞赛赛场准备好,就等同学们入驻展示
  7. 都觉得FFT简单实用,可为什么还有人不断问问题呢?
  8. 第十七届智能车竞赛研讨会
  9. 智能车竞赛技术报告 | 节能信标组 - 重庆大学- 赛博坦汽车人联盟
  10. 增加行星轮减速后机械臂调试