自定义类型:结构体【上】

news/2024/10/16 7:17:35 标签: android, windows, c语言, c++, 开发语言

在这里插入图片描述


一.结构体类型的声明

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。结构的声明基本形式:

struct tag
{
      member-list;
}variable-list;

例如描述一个学生:

在这里插入图片描述


二.结构体变量的创建和初始化

我们直接先来看一个例子:

在这里插入图片描述

s1,s2,s3都是结构体变量,这些变量和上面的s4,s5,s6变量是一个道理的,但是上面的是全局的结构体变量,下面的是局部变量。

初始化的时候,因为结构体不是一个成员,我们要用大括号初始化,按着顺序一个一个给值,对变量初始化,这就是结构体变量的初始化。

比如:

在这里插入图片描述

我们还可以用另一种方式赋值。

在这里插入图片描述


三.结构成员访问操作符

我们举例来看怎么样访问结构体成员,并顺便把它打印出来。

在这里插入图片描述

这里用到了.操作符,用法是:结构体变量名.成员名。


四.结构体的特殊声明

在声明结构的时候,可以不完全的声明,比如:

在这里插入图片描述

这个时候结构体类型是没有名字的,这个结构体类型就叫做匿名结构体类型。匿名结构体-这种类型只能使用一次,因为它无法再进行创建变量。就是第一次创建这结构体类型的时候,用这个类型直接创建一个变量,只用一次,以后再也用不上了。

我们再来看这个代码:

在这里插入图片描述

第二段代码之前的是结构体指针类型,结构体类型加一个星就是结构体指针类型,p就是指针变量,所以p可以存放地址,那我们到底能不能将x的地址赋给p呢?

在这里插入图片描述

显然实际上是不行的,会报警告,编译器会认为这是两种不同的类型,因为这两个结构体连名字都没有,无法识别类型,所以当你赋值的时候会报警告。

编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。一定要记住:如果你要匿名,你要保证只用一次。


五.结构的自引用

这个结点能存数据又能有义务找到下一个结点,那该怎么做呢?我们先画图理解一下:

在这里插入图片描述

那我们把这个结点设置一个结构体,让它既包含数据,又包含下一个结点,每个结点都能包含一个数据和一个结点。那我们这样做到底行不行呢?

在这里插入图片描述

其实是不行的。我们怎么算这个结构体大小是多少?一个结点包含一个同类型的结点,那就是结点里面套结点,结点里面套结点,一直下去,理论上这个结点的大小是无限大的。所以这种写法一定是错误的。

那像链表这些结构怎么来定义呢?我们不就是想要这个结点找到下一个结点吗?,我们把下一个结点的地址放到上一个结点中不就行了。来看:

在这里插入图片描述

这个时候大小就比较好算了,一个指针不就是4个或8个字节,还有一个整型4个字节,所以整体结构体大小我们也能算出来。

这就是结构体自引用,一个结构体变量里面想找到跟它同类型的其他结点,那我们就可以用一个结构体指针变量作为这个结构体的成员。其实链表就是基于这种形式实现的,它的结点就是像我们上面的写的代码一样定义的。

正确的自引用方式:

struct Node
{
    int data;
    struct Node* next;
};

在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型重命名,也容易引起问题,我们来看下面的代码:

在这里插入图片描述

我们用typedef重命名结构体名字为:Node,我们括号里面成员也改成Node* next,我们这样写有问题吗?

在这里插入图片描述

我们发现报错了,意思是当我们在括号里面成员使用Node的时候还没有Node。我们是有这个结构体类型才产生名字Node,而你在括号里面就提前用到了Node,这样是不行的,那我们怎么办呢?请看下面:

在这里插入图片描述

所以当你这结构体里面有同类型指针的时候,不要用它重命名新的名字,用旧的名字。从上面我们看到结构体有对齐方式,这是什么意思?,这就是我们将要讲的结构体内存对齐。

敬请期待下一篇,读下来对你有用的话,请给作者留下一个

在这里插入图片描述


http://www.niftyadmin.cn/n/5707541.html

相关文章

欧几里得球(Euclidean Ball)和椭球(Ellipsoid)

文章目录 一、欧几里得球(Euclidean Ball)1. 定义2. 欧几里得距离3. 例子4. 性质 二、椭球(Ellipsoid)1. 定义2. 具体形式3. 例子4. 性质5. 变换关系 三、欧几里得球与椭球的关系四、应用1. 统计学2. 优化理论3. 物理学4. 计算机图…

夏普MX-M4608N报(需要维护。代码:FK3)故障检修

基本参数: 型 号:MX-M4608N 产品类型:数码复印机 涵盖功能:复印/打印/扫描/传真 速度类型:高速 标配内存:复印打印内存3GB(可选购2GB内存) 硬盘容量:320G 预热时间:12秒 接口类型:USB2.0接口,RJ-45接口 最大原稿尺寸:A3 供纸容量:60-220克;手送纸盒…

基于JAVA+SpringBoot+Vue的旅游管理系统

基于JAVASpringBootVue的旅游管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽兄…

JavaScript 中的 DOM 尺寸测量与节流技巧

“今日事,今日毕” 文章目录 前言文章有误敬请斧正 不胜感恩!一、如何获取元素的尺寸1. Element.clientHeight 和 Element.clientWidth2. Element.scrollHeight 和 Element.scrollWidth3. Element.scrollTop 和 Element.scrollLeft 二、节流(Throttle&am…

重置SteamVR

在Vr开发过程中,有时候会出现Unity启动便卡死的情况,那么最简单的操作就是重置一下SteamVR 操作步骤 关闭Steam和SteamVR找到并删除以下所有文件 C:\Program Files (x86)\Steam\steamapps\common\SteamVR\resources\settings\default.vrsettingsC:\Pro…

内核定时器API实现点灯

1.内核定时器 定时器是一个很常用的功能,需要周期性处理的工作都要用到定时器。 Linux 内核定时器 采用系统时钟来实现,并不是6ull里面的硬件定时器。 Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即…

R语言手工实现主成分分析 PCA | 奇异值分解(svd) 与PCA | PCA的疑问和解答

几个问题: pca可以用相关系数矩阵做吗?效果比协方差矩阵比怎么样?pca做完后变量和样本的新坐标怎么旋转获得?pca做不做scale和center对结果有影响吗?pca用因子分解和奇异值分解有啥区别?后者怎么获得变量和样本的新坐标?1. 用R全手工实现 PCA(对比 prcomp() ) 不借助包…

进程的优先级详解(在Linux中观察进程优先级,优先级的概念,优先级范围,进程的切换和切换的过程和理解)

文章目录 进程的优先级什么是进程的优先级?进程的优先级的划分1. 优先级的级别划分2. 动态与静态优先级 那么为什么要有优先级呢?区分 那么是怎么确定优先级的呢? Linux中的优先级Linux中的进程优先级补充 Linux优先级的范围进程的切换切换过…