当前位置: 首页 > news >正文

【C语言】结构体和共用体

目录

  • 一、结构体
    • (一)结构体声明
    • (二)结构体变量定义
    • (三)结构体变量的初始化
    • (四)结构体的引用
    • (五)结构体数组
  • 二、共用体
    • (一)共用体定义
    • (二)共用体类型数据的特点

一、结构体

C语言数组允许定义可存储相同类型数据项的变量,结构是 C 语言编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。

(一)结构体声明

结构体定义由关键字 struct结构体名组成,结构体名可以根据需要自行定义。
struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct tag { member-listmember-list member-list  ...
} variable-list ;
  • tag 是结构体标签
  • member-list 是标准的变量定义,比如 int i; 或者 float f;,或者其他有效的变量定义
  • variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量

例如:一个学生的学号、姓名、年龄、成绩、地址,是相互联系的数据,在C语言中使用结构体来定义:
在这里插入图片描述

struct student
{	int num;			//学号char name[20];		//姓名char sex;			//性别int age;			//年龄float score;			//成绩char addr[30];			//地址
};
  • struct是关键字,不能省略
  • student是定义的结构体类型名
  • 结构体中的每一个数据,称为结构体“成员”或者“域”
  • 结构体变量所占内存长度等于各成员所占内存长度之和
  • 结构体变量中的各成员,在内存中顺序存放
  • 结构体变量所占内存大小用运算符sizeof()计算

(二)结构体变量定义

定义结构体变量有四种方式:
1、先定义结构体类型,再定义结构体变量
例如:

struct student
{	int num;			//学号char name[20];		//姓名char sex;			//性别int age;			//年龄float score;			//成绩char addr[30];		//地址
};struct student student1,student2;

2、定义结构体类型时同时定义结构体变量

例如:

struct student
{	int num;			//学号char name[20];		//姓名char sex;			//性别int age;			//年龄float score;			//成绩char addr[30];		//地址
}student1,student2;

3、直接定义结构体变量,不出现结构体名

例如:

struct 
{	int num;			//学号char name[20];		//姓名char sex;			//性别int age;			//年龄float score;			//成绩char addr[30];		//地址
}student1,student2;

4、成员是另一个结构体的变量
例如:

struct date				//日期结构
{	int month;			//月int day;				//日int year;				//年
};
struct student
{	int num;				//学号char name[20];			//姓名char sex;			//性别int age;				//年龄struct date birthday;	char addr[30];			//地址
}student1,student2; 

在这里插入图片描述

(三)结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。
例如:

struct student
{	long int num;			//学号char name[20];			//姓名char sex;				//性别char addr[20];			//地址	
}a   =   {  1001,"Mary",'F',"123 Beijing Road"};

在这里插入图片描述

(四)结构体的引用

一般情况下,不能将结构体变量作为整体进行引用,只能引用其中的成员。
引用结构体成员方式:结构体变量名.成员名(.是成员运算符)

printf("%d",student1.num);	//	正确引用
printf("%d,%s,%c,%d,%f,%s",student1);	//	错误引用

当成员是另一个结构体变量时,应当逐级引用成员。
例如:
在这里插入图片描述

struct date				//日期结构
{	int month;			//月int day;				//日int year;				//年
};
struct student
{	int num;				//学号char name[20];			//姓名char sex;			//性别int age;				//年龄struct date birthday;	char addr[30];			//地址
}student1;student1.num;
student1.name;
student1.birthday.month;
student1.birthday.day;
student1.birthday.year;

只有以下两种情况,可以将结构体作为一个整体进行访问:
1、结构体变量整体赋值
例如:student2 = student1;
2、取结构体变量地址
例如:print(“%p”,&student1);

(五)结构体数组

现在一个学生信息结构体要存放多个学生的信息应该怎么做?使用结构体数组。
在这里插入图片描述
1、结构体数组定义
例如:

struct student{	int num;char name[20];char sex;int age;float score;char addr[30];};
struct student stu[3];//三个元素的结构体数组

在这里插入图片描述

2、结构体数组初始化
例如:

struct student
{	int num;char name[20];char sex;int age;float score;char addr[20];
}stu[3]={{1001,"Mary",'F',18,89,"Beijing Road"},{1002,"Jack",'M',19,83,"Shanghai"},{1003,"Hare",'M',19,78,"Shengyan"}};

3、结构体数组的引用
例如:输出学生信息

#include <stdio.h>struct student
{	int num;char name[20];char sex;int age;float score;char addr[20];
}stu[3]={{1001,"Mary",'F',18,89,"Beijing"},{1002,"Jack",'M',19,83,"Shanghai"},{1003,"Hare",'M',19,78,"Shengyan"}};void main()
{	int i;for(i=0;i<3;i++)printf("%d  %s  %c  %d  %.2f   %s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].score,stu[i].addr);
}

二、共用体

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

(一)共用体定义

必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:

union [union tag]
{member definition;member definition;...member definition;
} [one or more union variables];

union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,可以指定一个或多个共用体变量,这是可选的。

例如:

union data
{	int i;char ch;float f;
}a,b,c;
//	或者
union data
{	int i;char ch;float f;
}
union data a,b,c;

共用体所占内存长度等于最长成员所占内存的长度

共用体变量的引用和结构体类似,例如:a.i a.ch a.f b.i b.ch b.f

(二)共用体类型数据的特点

  1. 同一内存段可以存放几种不同类型的成员,但是在某一时刻只能存放其中一个成员数据
  2. 共用体变量起作用的成员是最后一次存放的成员
  3. 共用体变量的地址和它的各成员的地址都是同一地址

相关文章:

【C语言】结构体和共用体

目录一、结构体&#xff08;一&#xff09;结构体声明&#xff08;二&#xff09;结构体变量定义&#xff08;三&#xff09;结构体变量的初始化&#xff08;四&#xff09;结构体的引用&#xff08;五&#xff09;结构体数组二、共用体&#xff08;一&#xff09;共用体定义&a…...

微搭低代码从入门到实战

低代码从21年起开始成为热点&#xff0c;至今已经发展了两年多的时间。微搭作为腾讯云旗下的低码产品也历经多轮优化。 不同人选择低代码有不同的理由&#xff0c;有的是初创企业希望低代码来提升运营效率的。有的是传统企业&#xff0c;希望借助低代码来改造现有系统提供移动…...

AM5728(AM5708)开发实战之安装Debian 10桌面操作系统

一 环境搭建 准备一个SD卡启动卡&#xff0c;能够正常引导板卡启动&#xff0c;后续会把Debian 10镜像安装到SD卡ext4分区 准备两个U盘&#xff0c;一个格式化成fat32文件系统&#xff0c;另一个格式化成ext4文件系统 下载Debian 10镜像&#xff0c;镜像名字为debian-10.4.0-a…...

ip-guardip-guard如何通过准入网关对指定的服务器进行通讯加密保护?

1、准入网关在高级配置设置受保护服务器; WEB管理界面【系统工具】,点击【配置管理】,点击参数设置,进入高级配置界面,输入配置内容即可。 [ControlServer]...

JavaScript基础语法

目录 1.初识JavaScript 1.1背景知识 1.2JS的三种书写方式 行内式 内嵌式 外部式 2.语法简介 2.1变量的使用 变量创建方法 动态类型 2.2基本数据类型 2.3数组 js数组创建方式 遍历方式 添加元素:尾插 ​编辑删除元素:splice 2.4函数 格式 函数表达式 作用域…...

《SQL基础》17. InnoDB引擎

InnoDB引擎InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理事务基础redo logundo logMVCC基本概念隐式字段undo log版本链readView原理分析InnoDB引擎 逻辑存储结构 InnoDB的逻辑存储结构如下图所示&#xff1a; 表空间 表空间是InnoDB存储引擎逻辑结构的最高层…...

api接口详解大全

api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口&#xff0c;可以帮助API使用者更好地了解、使用和集成&#xff0c;同时帮助人们有效地维护它每个产品都需要使用手册&#xff0c;API也不例外在API领域&#xff0c;可以将设计视为服务器和客户端之…...

为什么要用VR全景?5个答案告诉你

看中了刚上市的一款新车&#xff0c;再也不用等车展、去4s店才能仔细观赏&#xff0c;点开手机就能“置身”车内近距离观看每一处细节&#xff0c;点击关灯开灯、关门关门&#xff0c;除了摸不到&#xff0c;和在现场几乎没有区别&#xff1b; 准备买房的时候&#xff0c;没人愿…...

常用的深度学习优化方式

全连接层 PyTorch中的全连接层&#xff08;Fully Connected Layer&#xff09;也被称为线性层&#xff08;Linear Layer&#xff09;&#xff0c;是神经网络中最常用的一种层。全连接层将输入数据的每个元素与该层中的每个神经元相连接&#xff0c;输出结果是输入数据与该层的…...

全面吃透Java Stream流操作,让代码更加的优雅

文章目录1 认识Stream流1.1 什么是流1.2 流与集合1.2.1 流只能遍历一次1.2.2 外部迭代和内部迭代1.3 流操作1.3.1 中间操作1.3.2 终端操作1.3.3 使用流2 学会使用Stream流2.1 筛选和切片2.1.1 用谓词筛选2.1.2 筛选各异的元素2.1.3 截短流2.1.4 跳过元素2.2 映射2.2.1 map方法2…...

机器学习学习记录1:假设空间

我们可以把学习过程看作一个在所有假设组成的空间中进行搜索的过程&#xff0c;搜索目标是找到与训练集"匹配" 的假设&#xff0c;即能够将训练集中的瓜判断正确的假设.假设的表示一旦确定&#xff0c;假设空间及其规模大小就确定了.对于西瓜问题&#xff0c;这里我们…...

开源工具系列5:DependencyCheck

Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck 是什么 Dependency-Check 是 OWASP&#xff08;Open Web …...

JDBC知识点全面总结2:JDBC实战编写CRUD

二.JDBC知识点全面总结1&#xff1a;JDBC实战编写CRUD 1.JDBC重要接口&#xff1f; 2.Driver和DriverMangement的关系&#xff1f; 3.JAVA与数据库连接 4.JAVA中使用statement来执行sql语句时&#xff0c;拼接字符串的sql注入问题&#xff1f; 5.使用preparedstatement进行…...

java - 数据结构,算法,排序

一、概念 1.1、排序 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 平时的上下文中&#xff0c;如果提到排序&#xff0c;通常指的是排升序&#xff08;非降序&#xff09;。 通常意义上的排序&#…...

二叉树经典14题——初学二叉树必会的简单题

此篇皆为leetcode、牛客中的简单题型和二叉树基础操作&#xff0c;无需做过多讲解&#xff0c;仅付最优解。有需要的小伙伴直接私信我~ 目录 1.二叉树的节点个数 2.二叉树叶子节点个数 3.二叉树第K层节点个数 4.查找值为X的节点 5.leetcode——二叉树的最大深度 6.leetc…...

基于NMOSFET的电平转换电路设计

一、概述&#xff1a; 在单片机系统中&#xff0c;5V、3.3V是芯片常用的电平。而在传输协议中(如IIC、SPI等协议)&#xff0c;存在芯片与芯片的高电平和低电平定义的范围不一样&#xff0c;所以需要存在一个电平转换电路&#xff0c;来使芯片与芯片之间顺利的传输。 二、前置…...

mongoDB搭建集群

(学习自黑马)下载对应linux版本MongoDB源码下载地址&#xff1a;https://www.mongodb.com/download-center#community目前在一台服务器开三个端口模拟三个mongodb, 配置一个主节点27017,一个从节点27018,一个仲裁者27019配置主节点,副节点,仲裁节点(下面的创建文件一共有三份,通…...

[深入理解SSD系列 闪存2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…...

最新 JVM 面试经典问题

文章目录 说说JVM的内存布局?知道new一个对象的过程吗?知道双亲委派模型吗?说说有哪些垃圾回收算法?标记-清除复制算法标记-整理那么什么是GC ROOT?有哪些GC ROOT?垃圾回收器了解吗?年轻代和老年代都有哪些垃圾回收器?G1的原理了解吗?什么时候会触发YGC和FGC?对象什么…...

HTML5 和 CSS3 的新特性

目标能够说出 3~5 个 HTML5 新增布局和表单标签能够说出 CSS3 的新增特性有哪些HTML5新特性概述HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...