『C语言初阶』第九章 -结构体

news2024/11/23 10:43:18

在这里插入图片描述

前言

今天小羊又来给铁汁们分享关于C语言的结构体,在C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型),今天我们主要简单了解一下结构体。


一、结构体是什么?

在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型的价格。在这些情况下,使用简单的基本数据类型甚至是数组都是很困难的。而结构体则可以有效的解决这个问题。
结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。
结构体的优点:结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。
简单的来说,结构体就是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。


二、结构体声明

一般形式:

struct 结构体类型名
{
	成员列表
};

所以,struct关键词是表示接下来是一个结构体

例如,声明一个学生的结构:

struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
};

上面的声明描述了一个包含三个不同类型的成员的结构,但它还没创建一个实际的数据对象,每个成员变量都用自己的声明来描述,以分号结束。花括号之后的分号表示结构声明结束。结构声明可以放在函数外(此时为全局结构体,类似全局变量,在它之后声明的所有函数都可以使用),也可以放在函数内(此时为局部结构体,类似局部变量,只能放在该函数内使用,如果与全局结构体同名,则会暂时屏蔽全局结构体)。


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

当我们声明结构体的类型之后,接下来就要对结构i进行定义和初始化了。

struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}s1,s2;           //声明类型的同时定义结构体变量
 
//定义结构体变量
struct student s3;
struct student s4;
int main()
{
	return 0;
}

上面的s1,s2,s3,s4就是普通的变量,放在全局中就是全局变量,刚在函数内部就是局部变量。
接下来看结构体初始化:

struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}s1 = { "zhuxinrui",21,"女","21006666" };
int main()
{
	//初始化:定义变量的同时赋值
	struct student s2 = { "yangrui",21,"女","210047218" };
	return 0;
}

1.typedef关键字

当我们每次定义结构体变量时,结构体的类型名过长,想要简化可以使用typedef来对结构体类型重定义

1:>

#include<stdio.hg>
typedef struct student stu;
struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
};
int main()
{
	stu s3 = { "yangrui",21,"女","210047218" };
	return 0;
}

2:>

#include<stdio.hg>
typedef struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}stu;
int main()
{
	stu s4 = { "yangrui",21,"女","210047218" };
	return 0;
}

2.匿名结构体

匿名结构体类型是指声明结构体的时候,可以不完全的声明

struct 
{
	int num;
};

那么问题来了,匿名结构体类型该如何定义变量呢?

错误写法

struct
{
	int num;
};
 
struct n1;
struct n2 = { 666 };

正确做法

struct
{
	int num;
}n1,n2={666};

总结:
必须在声明匿名结构体类型时就定义变量。

四、结构体传参

当我们将结构体变量作为为函数参数进行传参的时候,该怎样接收并使用呢?

用法示例

结构体打印函数

#include<stdio.h>

typedef struct teacher T;
typedef struct student S;

struct teacher
{
	char name[20];
	char subject[20];

};

struct student
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
	T t1;
};

S s1 = { "阿蕊",20,"女","21006666",{"老王","语文"} };


void print1(S s)
{
	printf("%-8s %-2d %s %s %s %s\n", s.name, s.age, s.sex, s.id, s.t1.name, s.t1.subject);
}

void print2(S* s)
{
	printf("%-8s %-2d %s %s %s %s\n", (*s).name, (*s).age, (*s).sex, (*s).id, (*s).t1.name, (*s).t1.subject);
}

int main()
{
	S s2 = { "小羊",21,"女","210047218",{"老丁","英语"} };
	print1(s1);
	print2(&s2);
	return 0;
}

问题来了,想一想print1和print2这两个函数,哪个更好呢?

小伙伴们想好了或者想不明白的可以问小羊,也可以评论区留言哦,最后希望这篇文章对大家在C语言的学习道路上有所帮助,大家跟好脚步,咱们很快就会跟新C语言进阶的内容了~

在这里插入图片描述

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

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

相关文章

02.FFMPEG的安装和添加硬件加速自编译

说一个极其郁闷的事情&#xff0c;就在昨天收到3399的一块板子后&#xff0c;往电脑上面一插&#xff0c;然后悲剧的事情就发生了&#xff0c;我的电脑蓝屏重启了&#xff0c;这下好了&#xff0c;我写到一半的帖子也不见了&#xff0c;我的SSH里面的记录全部消失了&#xff0c…

一文解析超标量处理器

一、引言 处理器&#xff08;central process unit,简称CPU&#xff09;是手机的核心部件&#xff0c;其主要功能是取指令并译码执行。CPU主要包括控制器和运算器两个部件&#xff0c;它对在手机中的所有硬件资源&#xff08;如存储器&#xff0c;输入输出单元&#xff09;进行…

等保案例 1

用户简介 吉林省人力资源和社会保障厅&#xff08;简称“吉林省人社厅”&#xff09;响应《网络安全法》的建设要求&#xff0c;为了向吉林省人民提供更好、更快、更稳定的信息化服务&#xff0c;根据《网络安全法》和等级保护2.0相关标准&#xff0c;落实网络安全与信息化建设…

AD20之PCB设计

一、原理图 1、CTRL鼠标滚轮 图纸的放大缩小 2、修改栅格颜色 3、选择图纸尺寸 4、编译原理图 选中项目右键 5、编译原理图后 出现原理图中所使用的元器件 或错误信息 元器件 编译原理图报错 6、编译原理图库后 选中右侧栏中元器件 可进行添加 或删除库中元器件 7、去…

欧拉OS 使用 CentOS 7 yum repo

一、下载CentOS的repo的yum文件 任何基于CentOS的yum的repo 的url是这样的&#xff1a; 但欧拉OS输出这个变量为&#xff1a;openEuler 20.03 (LTS-SP3) 那明显欧拉想要使用这个yum的url找不到这个版本&#xff0c; 所以直接讲这个变量替换为 7, Centos 7的7 然后执行&…

C进阶(1/7)——数据在内存中的存储

目录 前言&#xff1a; 一.数据类型介绍 类型基本归类&#xff1a; 整型家族&#xff1a; 浮点数家族&#xff1a; 构造类型&#xff1a; ​指针类型&#xff1a; 空类型&#xff1a; 二.整型在内存中的存储 1.原码&#xff0c;反码&#xff0c;补码 2.大小端介绍 3.练…

web基础入门和php语言基础入门 二

web基础入门和php语言基础入门 二 MySQL入门-续MySQL之数据查询操作MySQL其他知识点 php语言基础入门认识PHPPHP的工作流程安装PHP环境认识一个PHP程序PHP基础知识点进入正题 PHP与WEB交互PHP与MySQL交互总结 MySQL入门-续 MySQL之数据查询操作 WHERE 子句&#xff0c;条件限…

面向对象设计与分析40讲(20)消息驱动编程和事件驱动编程模型

文章目录 消息驱动编程事件驱动编程消息驱动和事件驱动的区别 消息驱动编程 消息驱动是一种编程模型&#xff0c;它基于事件和消息的传递来驱动程序的执行流程。在消息驱动的模型中&#xff0c;系统中的各个组件&#xff08;或对象&#xff09;通过发送和接收消息进行通信和协…

如何基于 ACK Serverless 快速部署 AI 推理服务

作者&#xff1a;元毅 随着 AI 浪潮的到来&#xff0c;各种 AI 应用层出不穷&#xff0c;众所周知 AI 应用对 GPU 资源强烈依赖&#xff0c;但 GPU 很昂贵&#xff0c;如何降低 GPU 资源使用成本成为用户首要问题。而 AI 与 Serverless 技术结合&#xff0c;完全可以达到按需使…

mysql中在有数据的表中新增一个主键处理方案

需求&#xff1a;因为业务需要修改表中原来的主键为新增的字段&#xff1b; 处理方案&#xff1a; 1、先将表名修改一下&#xff1b; 2、新增一个一样的表结构&#xff0c;表名与原表名一致&#xff0c;多了一个主键&#xff08;自增&#xff09;的字段&#xff1b; 3、把原…

ArcGIS入门操作手册

一.ArcGIS安装过程 参考本人博客&#xff1a;保姆级Arcgis安装图文安装教程_追忆苔上雪的博客-CSDN博客 二.ArcGIS植被指数计算 (1)使用工具&#xff1a;栅格计算器 打开软件&#xff0c;右侧搜索栅格计算器打开&#xff0c;要是搜索栏不小心叉掉找不到了&#xff0c;可以通…

cmake-ibmtpm1682编译

1、error Ossl library is using different radix 异常解决 RADIX_BITS由 64改成32 --whole-archive CMakeFiles\ibm-tpm-my.dir/objects.a -Wl, --no-whole-archive CMakeFiles\ibm-tpm-my.dir\linklibs.rsp CMake中的 --whole-archive以及–no-whole-archive两者都是编译器…

【数据库】Sql Server可视化工具SSMS条件和SQL窗格以及版本信息

2023年&#xff0c;第34周&#xff0c;第1篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; SQL SERVER 官方本身就有数据库可视化管理工具SSMS&#xff0c;所以大部分都会使用SSMS。以前版本是直接捆绑&#xff0c; 安装完成就自带有…

idea入门与maven配置的一些介绍

idea入门与maven配置的一些介绍 1.确保Java和Maven已安装2.创建一个新的Maven项目3.导航到要创建项目的目录配置Maven4.配置项目的pom.xml文件5.配置其他Tomcat和设置jdk6.构建和运行项目 关于idea入门基础配置 步骤1&#xff1a;安装IntelliJ IDEA 首先&#xff0c;从IntelliJ…

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

vmalert集成钉钉告警

vmalert通过在alert.rules中配置告警规则实现告警&#xff0c;告警规则语法与Prometheus兼容&#xff0c;依赖Alertmanager与prometheus-webhook-dingtalk实现钉钉告警&#xff0c;以下步骤&#xff1a; 1、构建vmalert 从源代码构建vmalert&#xff1a; git clone https://…

TCGA数据下载推荐:R语言easyTCGA包

#使用easyTCGA获取数据 #清空 rm(listls()) gc() # 安装bioconductor上面的R包 options(BioC_mirror"https://mirrors.tuna.tsinghua.edu.cn/bioconductor") if(!require("BiocManager")) install.packages("BiocManager") if(!require("TC…

制作自己的数据集并训练的YOLOv8模型

文章目录 1.制作数据集1.1 下载安装labelImg1.2 开始制作数据集 准备训练分配数据集训练测试 1.制作数据集 1.1 下载安装labelImg LabelImg源码 下载好源码并 cd到源码路径下 安装需要的环境 # 安装lxml pip install lxml# 安装pyqt5 pip install pyqt5# 将"resources…

机器学习算法之-逻辑回归(1)

什么是回归 回归树&#xff0c;随机森林的回归&#xff0c;无一例外他们都是区别于分类算法们&#xff0c;用来处理和预测连续型标签的算法。然而逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问…

【PubMed】生物医学文献数据库检索指南

【文献检索一般步骤】 搜索关键词&#xff0c;筛选结果&#xff0c;阅读摘要&#xff0c;获取全文。 第一步&#xff1a;访问PubMed 打开浏览器并进入PubMed网站&#xff08;https://pubmed.ncbi.nlm.nih.gov/&#xff09;。 第二步&#xff1a;构建查询 在PubMed首页的搜…