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

news2024/9/30 3:35:04

目录

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

一、结构体

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

(一)结构体声明

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

struct tag { 
    member-list
    member-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. 共用体变量的地址和它的各成员的地址都是同一地址

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

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

相关文章

全球商城库存系统架构设计与实践

业务背景 商城原库存系统耦合在商品系统&#xff0c;考虑到相关业务逻辑复杂度越来越高&#xff0c;库存做了服务拆分&#xff0c;在可售库存管理的基础上新增了实物库存管理、秒杀库存、物流时效 、发货限制、分仓管理等功能&#xff0c;满足了商城库存相关业务需求。 系统架构…

GitLab 存储型XSS漏洞 (CVE-2023-0050)

漏洞描述 GitLab 是由GitLab公司开发的、基于Git的集成软件开发平台。kroki是一款集成在GitLab的基于文本的图表描述自动转为图片的开源工具&#xff0c;在GitLab 13.7引入。 由于Kroki中lib/banzai/filter/kroki_filter.rb对接收的image_src过滤不严&#xff0c;具有AsciiDo…

SpringBoot 整合 clickhouse和mysql 手把手教程全网最详细

最近做一个项目 需要 整合mysql clickhouse 多数据源 后台用的是ruoyi框架 1. 首先pom引入相关依赖 <!--JDBC-clickhouse数据库--><dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version&…

Homekit智能家居产品---智能吸顶灯

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”&#xff0c;除了实用的照明功能外&#xff0c;对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢&#xff1f; 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#x…

5款小巧好用的电脑软件,让你的工作生活更加高效!

不得不说良心好软件让大家好评连连&#xff0c;爱不释手&#xff0c;不像某些软件自带广告弹窗。这期就由我给大家安利几款电脑中的得力助手&#xff0c;看看你都用过几个&#xff1f; 1.桌面管理神器——Coodesker Coodesker是一款免费小巧、无广告&#xff0c;功能简单的桌…

【Redis】哨兵机制(三)

目录 3.Redis哨兵 3.1.哨兵原理 3.1.1.集群结构和作用 3.1.2.集群监控原理 3.1.3.集群故障恢复原理 3.1.4.小结 3.2.搭建哨兵集群 3.3.RedisTemplate 3.3.1.导入Demo工程 3.3.2.引入依赖 3.3.3.配置Redis地址 3.3.4.配置读写分离 3.Redis哨兵 Redis提供了哨兵&am…

Spring Cloud Gateway学习

文章大纲 为什么需要网关&#xff1f; 传统的单体架构只有一个服务开放给客户端调用&#xff0c;但是在微服务架构体系中是将一个系统拆分成多个微服务&#xff0c;那么作为客户端如何去调用这些微服务呢&#xff1f;如果没有网关的存在&#xff0c;就只能在本地记录每个微服务…

彻底关闭Windows10更新!!

以下四个步骤都需要执行。 一、禁用Windows Update服务 1、同时按下键盘 Win R&#xff0c;然后输入 services.msc &#xff0c;点击确定。 2、找到 Windows Update 这一项&#xff0c;并双击打开。 3、双击打开它&#xff0c;点击 停止&#xff0c;把启动类型选为 禁用&…

SpringBoot+@Async注解-异步调用

编程开发里&#xff0c;使用java异步执行方法可以让程序同时处理多个请求业务&#xff0c;提升吞吐量来缩短业务的执行时间&#xff0c;在springboot的程序应用中&#xff0c;提供了Async注解来实现异步执行方法。在业务开发中&#xff0c;有些时候是不需要立即返回业务的处理结…

前端代码质量-圈复杂度原理和实践

1. 导读 你们是否也有过下面的想法&#xff1f; 重构一个项目还不如新开发一个项目…这代码是谁写的&#xff0c;我真想… 你们的项目中是否也存在下面的问题&#xff1f; 单个项目也越来越庞大&#xff0c;团队成员代码风格不一致&#xff0c;无法对整体的代码质量做全面的…

【LeetCode】剑指 Offer 25. 合并两个排序的链表 p145 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/ 1. 题目介绍&#xff08;25. 合并两个排序的链表&#xff09; 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 【测试用例】&#xf…

软件测试分类知识分享,第三方软件测试机构收费贵不贵?

软件测试可以很好的检验软件产品的质量以及规避产品上线之后可能会发生的错误&#xff0c;随着技术的发展&#xff0c;软件测试已经是一个完整且体系庞大的测试活动&#xff0c;不同的测试领域有着不同的测试方法、技术与名称&#xff0c;那么具体有哪些分类呢? 一、软件测试…

centos7部署KVM虚拟化

目录 centos7部署KVM虚拟化平台 1、新建一台虚拟机 2、系统内的操作 1、修改主机名 2、挂载镜像光盘 3、ssh优化 4、设置本地yum仓库 5、关闭防火墙&#xff0c;selinux 3、安装KVM 4、设置KVM网络 5、KVM部署与管理 6、使用虚拟系统管理器管理虚拟机 创建存储池 …

[曾经沧海难为水]两数求和

本来可以面试成功就差HR面试了&#xff0c;现在给我说恒英也要机试题了。我现在肝机试题吧&#xff01;大环境就是这&#xff0c;记录两周一个机试学习过程V1&#xff1a;自己写的暴力法V2&#xff1a;暴力法2:通过python的**str in list**方式逐个遍历&#xff0c;虽然代码看似…

什么叫GPC爬虫池?

什么叫GPC爬虫池&#xff1f; 答案是&#xff1a;全称光算谷歌爬虫池。 GPC爬虫池是一个深度研究谷歌SEO规律算法而创造的一种吸引谷歌爬虫的技术手段。 主要实现原理是通过建设庞大的站群系统&#xff0c;复杂的内链&#xff0c;外链结构体系&#xff0c;起到吸引谷歌爬虫&…

NetworkMiner网络取证分析工具(26)

预备知识 NetworkMiner是一款windows平台下开放源代码的网络取证分析工具&#xff0c;同时也是一款比较好的协议分析工具&#xff0c;它通过数据包嗅探或解析PCAP 文件能够检测操作系统&#xff0c;主机名和网络主机开放的端口。 除了能够进行基本的数据包抓取分析N…

剑指 Offer day5, day6

剑指 Offer day5&#xff0c; day6 二分查找和二叉树的题目 剑指 Offer 04. 二维数组中的查找 剑指 Offer 04. 二维数组中的查找 - 力扣&#xff08;Leetcode&#xff09; 依然是利用特殊的数据状况改进查找的速度&#xff0c;注意边界条件。 题解这个类比二叉树的思路非常…

第五章:C语言数据结构与算法之双向带头循环链表

系列文章目录 文章目录系列文章目录前言一、哨兵位的头节点二、双向链表的结点三、接口函数的实现1、创建结点2、初始化3、尾插与尾删4、头插与头删5、打印6、查找7、随机插入与随机删除8、判空、长度与销毁四、顺序表和链表的对比总结前言 一般题目给的单链表是无头单向非循环…

GCC编译器编译C/C++程序(一步完成、分步完成)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、编译的流程 编译C/C 程序&#xff0c;是指将C/C源代码转变为可执行程序。 这需要经历4个过程&#xff1a;预处理&#xff08;Preprocessing&#xff09;、编译&#xff08;Compi…

一次线上事故排查

问题3月1日监控系统监测到某子系统所在机器Cpu突然飙升。排查系统首先登录对应系统的机器&#xff0c;top查看机器信息&#xff0c;显示当前cpu已经到了800%top 显示800%根据top的pid查看对应服务&#xff0c;查看服务子进程排查子线程&#xff0c;发现子线程有8个都100%了&…