当前位置: 首页 > 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. 共用体变量的地址和它的各成员的地址都是同一地址
http://www.lryc.cn/news/35329.html

相关文章:

  • 微搭低代码从入门到实战
  • AM5728(AM5708)开发实战之安装Debian 10桌面操作系统
  • ip-guardip-guard如何通过准入网关对指定的服务器进行通讯加密保护?
  • JavaScript基础语法
  • 《SQL基础》17. InnoDB引擎
  • api接口详解大全
  • 为什么要用VR全景?5个答案告诉你
  • 常用的深度学习优化方式
  • 全面吃透Java Stream流操作,让代码更加的优雅
  • 机器学习学习记录1:假设空间
  • 开源工具系列5:DependencyCheck
  • JDBC知识点全面总结2:JDBC实战编写CRUD
  • java - 数据结构,算法,排序
  • 二叉树经典14题——初学二叉树必会的简单题
  • 基于NMOSFET的电平转换电路设计
  • mongoDB搭建集群
  • [深入理解SSD系列 闪存2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现
  • 最新 JVM 面试经典问题
  • HTML5 和 CSS3 的新特性
  • Vulnhub系列:FristLeaks
  • XWiki Annotation Displayer 存在任意代码执行漏洞(CVE-2023-26475)
  • 数字孪生GIS智慧风场Web3D可视化运维系统
  • Retrofit核心源码分析(二)- 网络请求和响应处理
  • STM32启动模式讲解与ICP下载电路
  • 5款小巧好用的电脑软件,让你的工作生活更加高效!
  • python线程池
  • 深入浅出PaddlePaddle函数——paddle.ones_like
  • 计算机组成原理(海明码效验)(3)-软件设计(二十四)
  • Linux2.2网络驱动程序编写
  • 像素密度提升33%,Quest Pro动态注视点渲染原理详解