今天上了数据结构课程的第一堂课,经常会看到下面这种语法:结构体有个成员变量是指向该结构体的指针,也就是自引用(self reference)。翻看了下一章节内容,才知道这是链表的结构基础。平时C语言用的比较少,借此机会重新复习了下结构体,在此记录相关知识。

结构体的声明

我们在定义结构体时,常常会用到两种方式。

方式1. 使用结构标签

用标签变量赋予结构体一个名字,这样定义结构体之后,可以用标签来声明结构体变量。

/*

**标签(tag)为成员列表提供一个名字,可以在后续的声明中使用

**下面这个声明,将标签PEOPLE与成员列表联系在一起(也就是定义了一个名为PEOPLE的结构体),

**并声明了名为Man与Women的两个结构体变量

*/

struct PEOPLE{

int a;

char b;

float c;

}Man,Women;//这里是声明的同时创建了两个变量。

/*

** 变量的声明

** 声明变量时,需要在标签名前加上关键字struct

*/

struct PEOPLE Boy,Girl;//声明了结构体变量 Boy 与 Girl

注意:声明结构体变量时一定要在前面加上struct关键字。但这样难免有些繁琐,所以大家都喜欢用下面介绍的方式2

方式2. 利用typedef技巧

/*

**typedef用于定义一个新的类型名,可以认为是为结构体起一个别名

**此段代码将原来的 struct PEOPLE 重新定义为类型people

*/

typedef struct PEOPLE{

int a;

char b;

float c;

}people;

/*

**变量的声明

*/

people Women,Girl; //声明了结构体变量 Women 与 Girl;

people Boy[20]; //声明了元素类型为结构体people的数组 Boy

可以看到,用typedef定义结构体后,结构体变量的声明变得十分方便。

结构体的自引用

结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针。这是实现链表结构的基础。

我们知道,顺序表的数据元素依次存放于一组地址连续的存储单元。而链表是用一组任意的存储单元来存放元素的,这些存储单元可以零散分布在内存的任何位置,大大提高存储器的使用效率。那么问题来了,既然存储单元地址不是连续的,那么前一个节点如何知道下一个节点的地址呢?这里就用到了结构体的自引用。在前一个节点(一个结构体变量)的成员变量中,把那个指针定义为下一个节点的地址,这样层层连接,实现了链表的存储。

但是,为什么定义结构体时,该成员变量是一个指针,而不直接声明该结构体自己呢?

https://blog.csdn.net/gzbaishabi/article/details/34926699

请看这篇文章,表述的非常好。

下面仍旧以两种结构体声明方式,分开讨论

方式1. 使用结构标签

错误的方式

/*

**下面这种声明是错误的。

**PEOPLE是一个结构体,成员变量b的仍旧是结构体

**在分配内存时,由于无限嵌套,编译器无法确定PEOPLE的长度

*/

struct PEOPLE{

int a;

struct PEOPLE b;

};//非法

正确的方式

/*

**由于指针的长度是确定的(指针长度为4),所以编译器能够确定该结构体的长度

*/

struct PEOPLE{

int a;

struct PEOPLE *b;

};

方式2. 使用typedef

错误的方式

/*

**下面这种声明是错误的。

**使用typedef时,程序执行到该段结束才完成了类型PEOPLE的定义

**因此,虽然这里用了指针,但还是错误,因为还没完成类型的定义

*/

typedef struct{

int a;

struct people *b;

}people;//非法

正确的方式

/*

**利用结构标签进行指针的声明

*/

typedef struct tag{

int a;

struct tag *b;

}people;

c语言 结构体声明和引用、,结构体的声明与自引用相关推荐

  1. C++结构体变量的引用 | 结构体变量引用

    C++结构体变量的初始化 C++对结构体变量可以在定义时指定初始值. struct Student{ //自定义结构体变量 int num;//学号 char sex;//性别 int age;//年 ...

  2. c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  3. c语言的结构体指针的引用,C语言中的指针、引用、数组、结构体

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  4. 【C语言入门教程】7.1 结构体类型变量的定义和引用

    前面学习了变量和数组这些简单的数据结构,它们的特点是必须使用规定的数据类型.例如数组被定义为整型后,它的所有存储单元都是由整型构成.现实生活中某一类事物的共同属性可能是由不同的数据类型组成的集合,或者 ...

  5. c语言 结构成员 变量引用,C++结构体变量的引用

    在定义了结构体变量以后,当然可以引用这个变量,常用的方法有以下几种. 1) 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量. 如上面的student1和student2都是student类 ...

  6. 11【C语言 趣味算法】个人所得税问题(结构体应用):结构体的声明、定义结构体类型的三种方法等

    Contents 一.Review 二.New Problem:Personal income tax issues(个人所得税问题) 2.1 Description of the problem 2 ...

  7. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  8. C语言结构体的定义与使用、结构体数组、指向结构体的指针(有代码详解)

    1.结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数 ...

  9. Go语言基础(七):结构体

    文章目录 一.类型别名和自定义类型 1.自定义类型 2.类型别名 3.类型定义和类型别名的区别 二.结构体 1.结构体定义 2.结构体实例化 (1)基本实例化 (2)匿名结构体 (3)创建指针类型结构 ...

最新文章

  1. 投影幕布尺寸计算器_如果把投影幕布安装在家里,有哪些安装位置和方式?
  2. 3.4 参数展开-机器学习笔记-斯坦福吴恩达教授
  3. 单片机上电复位电路图大全
  4. HDU 1455 Sticks
  5. 如何开发一个异常检测系统:异常检测 vs 监督学习
  6. 【100题】第三十三 高级字符匹配(和谐系统原理)
  7. 心跳超时时间设置_定时器实现之时间轮算法
  8. python label显示图片_高大上的YOLOV3对象检测算法,使用python也可轻松实现
  9. BZOJ 1055 [HAOI2008]玩具取名 DP
  10. 微型计算机原理及应用 阶段作业,微机原理及应用第三次作业
  11. 1+x云计算平台运维与开发初级
  12. 酷柚易汛工资条代码全开源,方便二次开发
  13. win7连接远程服务器特别慢,技术员告诉您win7远程桌面连接速度慢的具体解决法子...
  14. 利用Udacity模拟器实现自己的自动驾驶小车
  15. [Ember Zigbee]zigbee应用程序RAM
  16. 神临的 Unity shader 学习之多Pass渲染 (九)
  17. 【English】十二、英语句子种类,陈述句、疑问句、祈使句、感叹句
  18. 团灭Leetcode打家劫舍问题
  19. 深入支付宝支付扫描支付-跳转支付宝二维码页面支付与自定义生成二维码支付-2跳转固定的支付宝页面进行扫码支付
  20. 再读《拆掉思维的墙》

热门文章

  1. 把斯坦福大学土地租出去?特曼坦言:目的就是赚钱
  2. 当音乐博士开始写代码...
  3. 谷歌:明年开始对应用内购买抽取 30% 分成;钉钉创始人无招将离任;Java O2OA V5.2.0 发布|极客头条
  4. 华为澳大利亚大动作,终止4.9亿投资;iPhone 12 或10月13日发布;Swift正式登陆Win 10 | 极客头条...
  5. 无代码来了,还要程序员吗?
  6. 全球呼吸机告急!医疗科技巨头美敦力“开源”设计图和源代码
  7. 微信小程序直播正式公测;刘强东 2020 年已卸任 8 家公司高管;React 16.13.0 发布| 极客头条...
  8. 小米回应 50 亿疫情贷款申请;​爱奇艺 App 崩溃;OpenSSH 8.2 发布 | 极客头条
  9. 传 ofo 年底裁员超 50%;Vivo 支持谷歌 Fuchsia OS;Spring Boot 2.2.2 发布 | 极客头条
  10. 惊!Python能够检测动态的物体颜色!