C语言——结构体详解

news2025/1/19 14:18:18

        今天我们就一起来了解一下C语言中结构体有关的知识吧!

        结构是什么?

        结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的变量。        

        我们之前也学习过数组,这里我们来区分一下结构体和数组的概念

        数组是一组相同类型元素的集合。

        结构体是一组不同类型元素的集合。

        我们可以了解到,结构体和数组都是元素的集合,区别是,结构体是不同类型的元素的集合。这里我们发现,结构体面向的对象是复杂的。

        结构体的声明

struct stu
{
	char name[20];
	int stu_num[20];
}s1;

        在这个代码中,我们声明了结构体stu,stu是标签名,可以理解为结构体的名称,这个名称并不是固定不变的,可以随我们心意和具体内容来设置,比如这串代码中,我们想设置一个学生的学号和姓名,我们就可以将结构体命名为stu(student)。

        当然结构体括号中的就是结构体的成员列表了,我们想表示姓名和学号,我们就定义两个数组来存放我们将要表示的内容,姓名需要定义char类型的,我们设置为name,学号这里我们定义为stu_num,因为学号是数字,所以我们定义类型为int。

        结构体成员的类型

        这里我们需要了解到结构体成员的类型:可以是标量,数组,指针,甚至可以是其他的结构体(后面举例说明)。

        结构体变量的定义和初始化

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//结构体变量的定义
struct stu
{
	char name[20];
	int stu_num;
	char sex[10];
	float score;
};
int main()
{
	//结构体变量的初始化
	struct stu s1 = { "zhangsan",0001,"nan",59.5f };
	struct stu s2 = { "wangwu",0003,"nv",60.2f };

	printf("%s %d %s %f", s1.name, s1.stu_num, s1.sex, s1.score);
	return 0;
}

        在这个代码中,我们定义了结构体stu,结构体面向的对象是学生,结构体的成员列表中包含了结构体对象stu的姓名,学号,性别,分数。这是我们对结构体stu的定义,告诉别人我们定义的结构体stu中都有什么成员。

        我们之前说结构体面向的对象是复杂的,这里就是他复杂的地方,面向一个学生对象可以有四个或者更多的结构体成员,而数组的话就只有一组相同类型的元素。

        在后面的主函数中,我们定义结构体对象的结构体变量,并且将它初始化,这里初始化就是对我们的结构体变量的各个成员进行填充,例如在代码中我们给结构体变量s1赋初值为:"zhangsan",0001,"nan",59.6f 。

        之后我们打印一下结构体变量s1的值,看看有没有初始化成功,结果显示无误:

        

        结构体成员的访问

        其实我们刚刚已经访问过结构体成员了,我们使用了(.)操作符,这是结构体成员访问的一种方式。

        代码解释

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct X
{
	int a;
	char c;
};
struct Y
{
	double d;
	struct X x;
	float f;
};

void print1(struct Y yn)
{
	printf("%lf %d %c %f\n", yn.d, yn.x.a, yn.x.c, yn.f);
}
void print2(struct Y* ym)
{
	printf("%lf %d %c %f\n", (*ym).d, (*ym).x.a, (*ym).x.c, (*ym).f);
	printf("%lf %d %c %f\n", ym->d, ym->x.a, ym->x.c, ym->f);
}
int main()
{
	struct Y y = { 5.2,{13,'b'},1.314f};
	//传值调用
	print1(y);
	//传址调用
	print2(&y);
	return 0;
}

        因为是给大家解释所以这里的结构体变量名称就尽量简单方便大家理解。

        解析

        首先我们定义结构体X,里面存放一个整型变量a和字符型变量c,再定义一个结构体Y,里面存放了一个双精度浮点型的d,结构体X和一个单精度浮点型的f。

        定义好我们的结构体之后我们对结构体变量y进行初始化,赋初值为: 5.2,{13,'b'},1.314f,这里有大家需要注意的点哦,我们发现在结构体Y的内部还有一个结构体X,那么这个时候我们就需要再来一个{}用来存放在结构体Y中结构体X的值了。

        传值调用

        我们通过函数调用的方式来实现结构体的传值调用,我们定义函数print1,传值调用我们主要使用点操作符来完成。但是我们在使用点操作符之前需要知道结构体变量是什么,此代码中,结构体变量y传参给print1函数为yn。

        printf("%lf %d %c %f\n", yn.d, yn.x.a, yn.x.c, yn.f);

        结构体变量.成员名

        传址调用

        我们还是使用函数调用的方式实现传址调用,定义函数print2,这里就需要注意了,我们既然是传址调用,那么我们就应该将地址作为参数进行传递,所以我们主函数中print2需要将y的地址传给print2函数中的* ym,地址需要一个指针来接收,我们这里一定不能忘记ym前的*号啊。

        传址调用有两种方式,但是不是很推荐第一种,因为操作起来很麻烦。

        第一种方式:

            printf("%lf %d %c %f\n", (*ym).d, (*ym).x.a, (*ym).x.c, (*ym).f);

        我们这边取地址之后解引用将结构体指针变为结构体变量的方式其实和传值调用是一样的,但是步骤要繁琐很多,属于是多此一举。

        第二种方式:

        printf("%lf %d %c %f\n", ym->d, ym->x.a, ym->x.c, ym->f);

        这种方式是直接使用地址的方式来进行传址调用,嗯对,物尽其用,但是这里也要注意,当我们结构体中还有结构体的时候,我们结构体成员X的结构体变量x需要的还是点操作符,因为这里我们ym->x的时候x已经是结构体变量了,所以我们直接使用点操作符就可以访问结构体变量x中的成员。

        结构体指针->成员名

        今天就到这里喽,希望大家都可以了解结构体的知识,大家下次再见!如有不足之处请各位指正!!!评论区留言一定会回大家的嘞!

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

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

相关文章

『FPGA通信接口』串行通信接口-IIC(2)EEPROM读写控制器

文章目录 1.EEPROM简介2.AT24C04简介3.逻辑框架设计4.随机读写时序5.仿真代码与仿真结果分析6.注意事项7.效果8.传送门 1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory) 是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入…

【Linux学习】Linux编辑器-vim使用

这里写目录标题 1. &#x1f320;vim的基本概念&#x1f320;2. vim的基本操作&#x1f320;3.vim异常处理&#x1f320;4. vim正常模式的相关命令&#x1f320;5. vim末&#xff08;底&#xff09;行模式相关命令 vi/vim都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本…

51单片机数字温度报警器_DS18B20可调上下限(仿真+程序+原理图)

数字温度报警器 1 **主要功能&#xff1a;*****\*资料下载链接&#xff08;可点击&#xff09;&#xff1a;\**** 2 **仿真图&#xff1a;**3 **原理图&#xff1a;**4 **设计报告&#xff1a;**5 **程序设计&#xff1a;**主函数外部中断函数DS18B20驱动 6 讲解视频7 **资料清…

跟着Carl大佬学leetcode之26 删除排序数组中的重复项

来 点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列 是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c…

实验室三大常用仪器2---函数信号发生器的基本使用方法(笔记)

目录 函数信号发生器的基本使用方法 如何连接函数信号发生器和示波器 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器3---交流毫伏表的使用方法&#xff08;笔记&#xff09;-CSDN博客 示波器是用来显示和测量信号的…

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架&#xff08;Java Collections Framework&#xff09;是一个强大的、高度灵活的数据结构库&#xff0c;它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类&#xff1a; Collection: 是单例集合类的顶层接口&#xff0c;包括Lis…

[数据结构]——二叉树——堆排序

后续代码以此为基础 typedef int HPDataTyp; typedef struct Heap {HPDataTyp * a; int size; int capacity; } Hp; 1.首先我们需要掌握两种堆算法 1&#xff0c;堆向下调整算法 现在我们给出一个数组&#xff0c;逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整…

【学习笔记】论文创新点

论文创新点 论文创新点的突破口 论文的烦恼 选择方向&#xff0c;热门方向&#xff08;但不是最新的&#xff09;。 经典的、持续时间长的&#xff0c;学习资源多。 应用型创新 适应在交叉学科 数量少 一般需要改进算法 怎么改进是一个很大的问题 因此寻找创新点十分重要 …

elmentui树形表格使用Sortable拖拽展开行时拖拽bug

1、使用elemntui的el-table使用Sortable进行拖拽&#xff0c;如下 const el this.$el.querySelector(.el-table__body-wrapper tbody) Sortable.create(el, {onEnd: (event) > {const { oldIndex, newIndex } event//拿到更新前后的下标即可完成数据的更新} })2、但是我这…

【Entity Framework】闲话EF中批量配置

【Entity Framework】闲话EF中批量配置 文章目录 【Entity Framework】闲话EF中批量配置一、概述二、OnModelCreating中的批量配置元数据API的缺点 三、预先约定配置忽略类型默认类型映射预先约定配置的限制约定添加新约定替换现有约定约定实现注意事项 四、何时使用每种方法进…

vivado 存储器校准调试

存储器校准调试 Vivado 中的存储器接口 IP 支持校准调试。其中存储有实用的核配置、校准和数据窗口信息 &#xff0c; 可在 Vivado 硬件管理器 中访问这些信息。“存储器校准调试 (Memory Calibration Debug) ”可随时用于读取此信息 &#xff0c; 并从存储器接口 IP 中获…

TongRds docker 镜像做成与迁移(by liuhui)

TongRds docker 镜像做成与迁移 一&#xff0c;使用 docker commit 命令制作 TongRds docker 镜 像 1.1 拉取基础镜像 centos 并运行该镜像 拉取镜像&#xff1a;docker pull ubuntu 镜像列表&#xff1a;docker images 运行镜像&#xff1a;docker run -itd --name myubuntu…

做外贸企业邮箱哪个好?外贸邮箱价格怎么样?

随着全球化的深入&#xff0c;外贸公司在国际市场上的竞争日益猛烈。公司邮箱是公司和外界沟通的重要桥梁&#xff0c;其挑选与使用对外贸公司至关重要。目前市面上&#xff0c;Zoho Mail公司邮箱&#xff0c;Gmail、Outlook、阿里云公司邮箱和腾讯企业邮箱等各有特色&#xff…

欢乐钓鱼大师加速、暴击内置脚本,直接安装

无需手机root,安装软件即可使用&#xff0c;仅限安卓。 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

【技巧】PPT文件如何添加公司LOGO?

在工作上&#xff0c;我们经常要给PPT文件添加上公司的logo&#xff0c;如果一页一页添加不但耗时耗力&#xff0c;还容易有遗漏。那怎样快速给PPT添加logo呢&#xff1f;不清楚的小伙伴一起来看看如何吧&#xff01; 操作步骤&#xff1a; 1.打开PPT文件&#xff0c;点击菜单…

资产收集利器-ARL灯塔

介绍 ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统&#xff0c;旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 它拥有收集管理资产、资产监控、扫描与管理指纹、Github 关键字监控、文件泄漏等风险检测、nuclei PoC 调用等功能。 搭建 灯塔…

Vitis AI 迁移学习并部署在DPU中

目录 1. 本文目的 2. ResNet18介绍 3. 迁移学习 4. 量化配置文件 5. 模型编译&#xff1a; 6. 总结 1. 本文目的 使用迁移学习的方法&#xff0c;将预训练的resnet18模型从原来的1000类分类任务&#xff0c;改造为适应自定义的30类分类任务。 2. ResNet18介绍 ResNet1…

零基础小白如何自学网络安全(入门)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

VMware17Pro虚拟机安装macOS教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装补丁4.1 解压补丁4.2 结束VMware相关进程4.3 运行补丁包 5. 安装macOS5.1 新建虚拟机5.2 修改虚拟机配置5.3 安装操作系统5.3.1 选择 ISO 映像文件5.3.2 开启虚拟机5.2.…

CommunityToolkit.Mvvm笔记---AsyncRelayCommand

AsyncRelayCommand 是 CommunityToolkit.Mvvm 中的一个功能&#xff0c;专门设计用来处理异步操作。它是 RelayCommand 的一个变体&#xff0c;提供了对异步任务的支持&#xff0c;允许开发者在 MVVM&#xff08;Model-View-ViewModel&#xff09;模式中方便地实现异步命令。使…