【C语言】结构

将不同类型的值存储在一起构成结构。

在C语言中,有数组和结构两种聚合数据类型。聚合数据类型指的是能够同时存储一个以上的单独数据。

数组是相同类型的元素的集合,其每个元素是通过下标引用或指针间接访问来选择的。

结构也是一些值的集合,这些值称为它的成员,一个结构的各个成员可能具有不同的类型。结构每个成员都有自己的名字,他们通过名字进行访问来选择的。

1.结构声明

在声明结构时,必须列出它所包含的所有成员。这个列表包括每个成员的类型和名字。

struct tag
{member-list
}variablle-list;

举几个例子进行说明:

struct
{int a;char b;float c;
}x;

上面这段代码,声明创建了一个名为x的变量,它包含3个成员:一个整数,一个字符和一个浮点数。

struct
{int a;char b;float c;
}y[20],*z;

上面这段代码,声明创建了两个变量,名为y和z。其中y是一个数组,包含了20个结构。z是一个指针,它指向这个类型的结构。

在此处需注意:变量y、z与变量x是两种不同的类型,即使他们的成员列表完全相同。

这时我们会想:是否某种特定类型的所有结构都必须使用一个单独的声明来创建呢?

事实并不需要如此,标签(tag)字段允许为成员列表提供一个名字,这样它就可以在后续中使用。标签允许多个声明使用同一个成员列表,并创建同一种类型的结构。

举个例子:

struct TEST
{int a;char b;float c;
};

上面这段代码,对结构的成员进行了声明,这个声明把标签TEST和这些成员联系在了一起。这个声明并没有提供变量列表,所有它并没有创建任何变量。

struct TEST x;
struct TEST y[20],*z;

这些声明使用标签TEST创建了3个变量。它创建了和最初的两个例子一样的变量,但存在一个重要的区别——现在的x、y、z都是同一种类型的结构变量。

声明结构时可以使用另一种良好技巧来创建,使用typedef创建一种新的类型,如下面例子:

typedef struct
{int a;char b;float c;
}Test;

这个技巧和声明一个结构标签效果一样。其区别在于Test现在是类型名而不是结构标签,所以在后续的声明如下:

Test x;
Text y[20],*z;

2.结构成员

结构成员可以是标量、数组、指针甚至其他结构。

如下例子:

struct TEST1
{int a[20];            //数组float f;              //变量long *p;              //指针struct TEST x;        //结构变量struct TEST y[20];    //结构数组struct TEST *z;       //结构指针
};

3.结构成员的直接访问

 结构变量的成员通过点操作符(.)访问的。(点操作符的结合性是从左向右结合)

点操作符接受两个操作数:左操作数是结构体变量的名字,右操作数是需要访问的成员名字。这个表达式的结果就是指定的成员。

以下面这个声明为例:

struct TEST1 test;

名字为a的成员是一个数组,所以表达式test.a就选择了数组a这个成员,这个表达式结果就是这个数组名,可以把它用在任何使用数组名的地方。

成员x是一个结构,所以表达式test.x的结果就是个结构名,可以用于任何使用普通结构变量的地方。

举例几个复杂表达式:

表达式test.x.a就是选择了结构test的成员x(也是一个结构体)的成员a。

表达式test.y[8].c,将这个表达式分解来看,y是一个结构数组,所以test.y是一个数组名,它的值是一个指针常量。对这个表达式使用下标引用操作,test.y[8]将选择一个数组元素。这个数组元素本身是一个结构,所以可以使用另一个点操作符取它的成员之一。如此,表达式test.y[8].c就是选择了结构test中的成员y[8](一个结构体)中的成员c。

4.结构成员的间接访问

如果我们拥有一个指向结构的指针,我们将通过->(箭头操作符)来间接访问该结构。

和点操作符一样,箭头操作符接受两个操作数,其中左边操作数必须是一个指向结构的指针。

箭头操作符对左操作数执行间接访问取得指针所指向的结构,然后和点操作符一样,根据右操作数选择一个指定的结构成员。

假定一个函数的参数是指向结构的指针,如下所示:

void func(struct TEST1 *cp);

如下是结构间接访问:

cp->a;    //访问一个数组名
cp->f;    //访问结构的浮点数成员
cp->x;    //访问一个结构

5.结构自引用

在一个结构内部包含一个类型为该结构本身的成员。

结构自引用声明如下:

struct TEST2
{int a;struct TEST2 *b;int c; 
};

或许我们会觉得在结构内部包含一个指向该结构本身的指针有些奇怪,但它事实上所指向的是同一类型的不同结构。在更加高级的数据结构,比如链表和树,都是用这种技巧实现的,每个结构指向链表的下一个元素或树的下一个分枝。

6.结构的初始化

结构初始化和数组初始化很相似。一个位于一堆花括号内部、由逗号分隔的初始值列表可用于结构中各个成员的初始化。这些值根据结构成员列表的顺序写出。

举个例子:

struct INIT_EX
{int a;          //整型变量short b[20];    //数组Test c;         //结构
}x;x = {10;{0,1,2};{25,‘x’,1.8};}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的,但是我们前面接触的文件都是系统中的文件,都是已经在进…

深度学习中的并行策略概述:2 Data Parallelism

深度学习中的并行策略概述:2 Data Parallelism 数据并行(Data Parallelism)的核心在于将模型的数据处理过程并行化。具体来说,面对大规模数据批次时,将其拆分为较小的子批次,并在多个计算设备上同时进行处…

分布式专题(10)之ShardingSphere分库分表实战指南

一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus,旨在…

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…

vue3+vite一个IP对站点名称的前端curd更新-会议系统优化

vue3-tailwind-todo https://github.com/kgrg/vue3-tailwind-todo 基于这个项目,把ip到sta的映射做了前端管理. 核心代码是存储和获得的接口,需要flask提供. def redis2ipdic():global ipdicipdic.clear()tmdiccl.hgetall(IPDIC_KEY)for k in tmdic.keys():ipdic[k.decode() …

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…

golang LeetCode 热题 100(动态规划)-更新中

爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1:输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&…

【每日学点鸿蒙知识】Charles抓包、lock文件处理、WebView组件、NFC相关、CallMethod失败等

1、HarmonyOS系统中如何使用Charles抓包? 在HarmonyOS操作系统中,使用Charles进行抓包的步骤如下: 在Charles中设置代理。 首先,在Charles的菜单栏上选择“Proxy”→“Proxy Settings”,然后填入代理端口&#xff0…

抓取手机HCI日志

荣耀手机 1、打开开发者模式 2、开启HCI、ADB调试 3、开启AP LOG 拨号界面输入*##2846579##* 4、蓝牙配对 5、抓取log adb pull /data/log/bt ./

WebAPI编程(第一天,第二天)

WebAPI编程(第一天,第二天) day01 - Web APIs 1.1. Web API介绍 1.1.1 API的概念1.1.2 Web API的概念1.1.3 API 和 Web API 总结 1.2. DOM 介绍 1.2.1 什么是DOM1.2.2. DOM树 1.3. 获取元素 1.3.1. 根据ID获取1.3.2. 根据标签名获取元素1.3.…

windows下Redis的使用

Redis简介: Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。 Redis通常被称为数据结构服务器,因为值(value&#xff…

【贪吃蛇小游戏 - JavaIDEA】基于Java实现的贪吃蛇小游戏导入IDEA教程

有问题请留言或私信 步骤 下载项目源码:项目源码 解压项目源码到本地 打开IDEA 左上角:文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件,点击确定 选择“从现有项目创建项目”。点击“下一步” 点击下一步&a…

RTOS下的任务管理

2.3 RTOS下的任务管理(***) RTOS的任务管理主要是进行哪些功能? RTOS的任务管理的多任务管理是怎样进行与实现的? 任务管理中FreeRTOS如何给每个任务分配CPU时间? 文章目录 2.3 RTOS下的任务管理(***)2.3.0 任务概述2.3.1任务的创建与删除2.3…

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播 1.1 概念 神经网络的前向传播(Forward Propagation)就像是一个数据处理的流水线。从输入层开始,按照网络的层次结构,每一层的神经元接收上一层神经元的输出作为自己的输入,经过线性变换(加权…

【初阶数据结构与算法】八大排序算法之归并排序与非比较排序(计数排序)

文章目录 一、归并排序二、非比较排序之计数排序三、归并排序和计数排序的性能测试 一、归并排序 归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide andConquer)的⼀个⾮常典型的应⽤   …

window安装TradingView

目录 下载安装包 修改文件后缀,解压 将K线换成国内涨红跌绿样式 下载安装包 https://www.tradingview.com/desktop/ 下载完成后是.msix格式文件 (我在win10和win11的系统中尝试运行msix都没有成功,所以放弃直接双击运行msix&#xff…

FPGA多路MIPI转FPD-Link视频缩放拼接显示,基于IMX327+FPD953架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案我这里已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频…

React+Vite从零搭建项目及配置详解

相信很多React初学者第一次搭建自己的项目,搭建时会无从下手,本篇适合快速实现功能,熟悉React项目搭建流程。 目录 一、创建项目react-item 二、调整项目目录结构 三、使用scss预处理器 四、组件库Ant Design 五、配置基础路由 六、配置…

Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定

本文仅作学习交流,不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本:Unity6 模板:3D 核心 渲染管线:URP ------------------------------…

从零开始的编程-java篇1.6.1 万变不离其宗,hello word

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…