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

news2024/9/24 9:25:26

在这里插入图片描述

前言

今天小羊又来给铁汁们分享关于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.h>
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.h>
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/900557.html

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

相关文章

Linux Mint 21.3 计划于 2023 年圣诞节发布

Linux Mint 项目近日公布了基于 Ubuntu 的 Linux Mint 发行版下一个重要版本的一些初步细节&#xff0c;以及备受期待的基于 Debian 的 LMDE 6&#xff08;Linux Mint Debian Edition&#xff09;版本。 近日&#xff0c;Linux Mint 项目负责人克莱门特-勒菲弗&#xff08;Clem…

ECA模块详解

注意&#xff1a;本文代码为自己理解之后实现&#xff0c;与原论文代码原理相同但并不完全一样&#xff0c;主要是输入张量的形状不同&#xff0c;若更想了解原文代码&#xff0c;可以访问&#xff1a;https://blog.csdn.net/weixin_45084253/article/details/124282580 &#…

使用RDP可视化远程桌面连接Linux系统

使用RDP可视化远程桌面连接Linux系统 远程桌面连接Linux安装安装包准备服务器安装xrdp远程连接 远程桌面连接Linux 通常使用SSH来连接服务器&#xff0c;进行命令行操作&#xff0c;但是这次需要远程调试生产环境的内网服务器&#xff0c;进行浏览器访问内网网站&#xff0c;至…

SQL助你面大厂(行列转换)

在面试中,不仅有算法题,还有这个老大难的SQL编写 SQL在面试中也是会经常会被问到&#xff0c;不仅仅是为了面试&#xff0c;在做项目的时候&#xff0c;往往用的最多的就是CRUD,这也提高不了我们的编写SQL的能力&#xff0c;所以最近我准备总结几个面试模板&#xff0c;以及一些…

webshell实践,在nginx上实现负载均衡

1、配置多台虚拟机&#xff0c;用作服务器 在不同的虚拟机上安装httpd服务 我采用了三台虚拟机进行服务器设置&#xff1a;192.168.240.11、192.168.240.12、192.168.240.13 [rootnode0-8 /]# yum install httpd -y #使用yum安装httpd服务#开启httpd服务 [rootnode0-8 /]# …

开发一个文生图的功能

文章目录 效果开发环境原理核心代码代码仓库问题效果 开发环境 Python 3.10PyCharm原理 借助开源项目stable-diffusion,通过该项目封装python库diffusers,可以轻易的实现文生图的功能。 关于更多diffusers的功能请访问:https://huggingface.co/docs/diffusers/index 核心代…

Linux命令200例:nc非常有用的网络工具(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

LeetCode128.最长连续序列

我这个方法有点投机取巧了&#xff0c;题目说时间复杂度最多O(n),而我调用了Arrays.sort(&#xff09;方法&#xff0c;他的时间复杂度是n*log(n)&#xff0c;但是AC了&#xff0c;这样的话这道题还是非常简单的&#xff0c;创建一个Hashmap&#xff0c;以nums数组的元素作为ke…

回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

Java源码分析(一)Integer

当你掌握Java语言到了一定的阶段&#xff0c;或者说已经对Java的常用类和API都使用的行云流水。你会不会有一些思考&#xff1f;比如&#xff0c;这个类是如何设计的&#xff1f;这个方法是怎么实现的&#xff1f;接下来的一系列文章&#xff0c;我们一起学习下Java的一些常见类…

CF 1354 C1 C2 Polygon Embedding(求奇偶正多边形的外接最小正方形的边长)

CF 1354 C1 / C2 Polygon Embedding(求奇偶正多边形的外接最小正方形的边长) Problem - C1 - Codeforces Problem - C2 - Codeforces EASY &#xff1a; 大意&#xff1a;给出一个偶数 n &#xff0c; 求 正 (2 * n) 边形的最小外接正方形的边长。 可以想出两种最直观的情况…

【VBA_选择区域的关键词更改颜色】

Private Sub CommandButtonl_Click() Cells.Font.ColorIndex 1 End Sub Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, i As Integer Dim T As String Dim C As Integer For Each rng In Selection T "河北" C 3 i 1 Do While InStr(…

【宝藏系列】一文讲透C语言数组与指针的关系

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】 文章目录 【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】&#x1f468;‍&#x1f3eb;前言1️⃣指针1️⃣1️⃣指针的操作1️⃣2️⃣关于指针定义的争议1️⃣3️⃣对教材错误写法的小看法 2️⃣指针和数组的区别2️⃣…

最全攻略之人工智能顶会论文发表

最全攻略之人工智能顶会论文发表 1. 人工智能顶会1.1 CCF 顶会列表2023年人工智能顶会时间线 2.人工智能顶会论文发表流程2.1 顶会论文发表流程2.2 顶会论文审稿流程 3.1顶会论文发表指南3.1 顶会论文七要素3.2 顶会论文写作要点 4.人工智能发展趋势4.1 人工智能未来趋势4.2 人…

基于Matlab 代码实现UWB信号的产生和调制、接收和检测系统

文末提供完整的matlab代码实现下载链接 介绍 本文将分为两部分介绍。在第一部分中,使用 TR 的建模UWB 信号发生器,生成编码二进制数据的脉冲调制信号。这第二部分涉及对接收第一部分中生成的信号的接收器进行建模提取并显示信息。每个信号的时间图和频率响应绘制了阶段。使用MA…

STM32使用IIC通信的引脚配置问题

STM32使用IIC通信的引脚配置问题 在使用IIC通信时&#xff0c;遇到引脚配置问题&#xff0c;记录一下&#xff1a; IIC的两个引脚SDA和SCL都要求既能输入又能输出。 问题&#xff1a; SDA线是由不同的器件分时控制的&#xff0c;这样就会有一个问题&#xff1a;当一个器件主动…

【Redis】Redisson分布式锁原理与使用

【Redis】Redisson分布式锁原理与使用 什么是Redisson&#xff1f; Redisson - 是一个高级的分布式协调Redis客服端&#xff0c;能帮助用户在分布式环境中轻松实现一些Java的对象&#xff0c;Redisson、Jedis、Lettuce 是三个不同的操作 Redis 的客户端&#xff0c;Jedis、Le…

flutter 的TextField在有值的情况下再次获取焦点有个水滴的问题

1、问题截图 2、 出现原因&#xff1a;由于触发了 Android 的文本框的粘贴、选择复制等操作。由于 Android 高开源&#xff0c;一般的文字长按即可出现拖动选择复制的选项&#xff0c;此处即是触发了这个。 3、解决办法&#xff1a;给TextField设置一个属性&#xff0c;禁止粘…

MISRA 2012学习笔记(3)-Rules 8.4-8.7

文章目录 Rules8.4 字符集和词汇约定(Character sets and lexical conventions)Rule 4.1 八进制和十六进制转译序列应有明确的终止识别标识Rule 4.2 禁止使用三字母词(trigraphs) 8.5 标识符(Identifiers)Rule 5.1 外部标识符不得重名Rule 5.2 同范围和命名空间内的标识符不得重…